Как заставить использование статической библиотеки над общей? - PullRequest
13 голосов
/ 07 июня 2010

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

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

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

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

Ответы [ 2 ]

14 голосов
/ 08 июня 2010

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

5 голосов
/ 08 июня 2010

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

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

Изменить:

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

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

...