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

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

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

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

EDIT: хотите использовать как можно меньше специфичных для платформы хаков.

2 ответов


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

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

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

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

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


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

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

Edit:

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

надеюсь, что это помогает.