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

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

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

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

Править: Смотря на использование как можно меньше платформа определенные взломы.

13
задан Rakete1111 14 January 2017 в 14:48
поделиться

2 ответа

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

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

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

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

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

14
ответ дан 1 December 2019 в 23:14
поделиться

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

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

Edit:

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

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

5
ответ дан 1 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: