Как принудительно использовать статическую библиотеку над 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. Работа с узлами в любом случае является лучшим решением, поскольку узлы файлов намного более универсальны, чем строка.
надеюсь, что это помогает.