Как принудительно использовать статическую библиотеку по сравнению с общим?

В моем SConscript у меня есть следующая строка:

Program("xtest", Split("main.cpp"), LIBS="mylib fltk Xft Xinerama Xext X11 m")

Как мне получить scons для использования mylib.a вместо mylib.so, динамически связывая динамические с другими библиотеками?

РЕДАКТИРОВАТЬ: Как можно меньше использовать хакеры для платформы.

Ответ 1

Передача полного пути к файлу, завернутого в файл node, приведет к статической привязке. Например:

lib = File('/usr/lib/libfoo.a')
Program('bar', 'main.c', LIBS = [lib])

Выведет следующую командную строку компоновщика

g++ -o bar main.o /usr/lib/libfoo.a

Обратите внимание, что флаг "-l" не передается компоновщику для этой записи LIBS. Это эффективно заставляет статическую связь. Альтернативой является изменение LINKFLAGS, чтобы получить то, что вы хотите, с оговоркой, что вы обходите сканер зависимостей библиотеки - статус библиотеки не будет проверен для перестроек.

Ответ 2

Чтобы сделать эту платформу независимой, добавьте env ['SHLIBSUFFIX'] в библиотеку, которую вы хотите использовать. env ['SHLIBSUFFIX'] предоставляет этот суффиксы для общих библиотек.

У вас также есть ['SHLIBPREFIX'], ['LIBPREFIX'], ['LIBSUFFIX'] и ['PROGSUFFIX'], все это полезно для таких ситуаций.

Edit:

Я, очевидно, не понял себя, поэтому я уточню. Возвращаемое значение этих поисков - это строки для pre/suffixes, которые использует платформа. Таким образом, вы можете ссылаться на файл, который вам нужен на каждой платформе. Обратите внимание: вы не можете использовать его как чистую строку, он должен быть встроен в файл node, как предлагает BennyG. В любом случае, работа с узлами является лучшим решением, поскольку файловые узлы гораздо более универсальны, чем строка.

Надеюсь, что это поможет.