Связывание с определенной общей библиотекой по имени файла с помощью Scons - PullRequest
0 голосов
/ 16 мая 2018

Я собираю библиотеку с помощью SCons.

Имя файла библиотеки, с которой я хочу связать, не начинается с обычного префикса "lib".

Я прочиталld Документация и проверьте в моей консоли, работающей с GCC, что, если я поставлю -l:filename.so, библиотека с именем "filename.so" будет найдена по указанным путям библиотек.

Когда я пробую это решение в моем файле SConscript,очевидно, Scons держит двоеточие перед именем библиотеки, но удаляет часть «.so», поэтому библиотека не может быть найдена, поскольку ее имя файла содержит расширение .so.

Обновление: краткий пример.

env = Environment()

hello = env.Program(["hello.cc"], LIBPATH=['.'], LIBS=[':kntlm.so'])

Этот скрипт Scons пытается скомпилировать исходный код "hello.cc" (только Hello World, без использования какой-либо библиотеки).В тот же каталог я скопировал, только для этого примера, библиотеку из моей системы.Я назвал его "kntlm.so" вместо его настоящего имени (libkntlm.so).

Из терминала я могу запустить это:

g++ -o hello hello.o -L. -l:kntlm.so

И GCC компилирует его без проблем.

Если я пытаюсь запустить Scons, я получаю следующее:

$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o hello hello.o -L. -l:kntlm
/usr/bin/x86_64-linux-gnu-ld: cannot find -l:kntlm
collect2: error: ld returned 1 exit status
scons: *** [hello] Error 1
scons: building terminated because of errors.

Как вы можете видеть, GCC, который выполняли Scons, включает "-l: kntlm", но он удален".so" с конца, поэтому файл библиотеки не может быть найден

Вы знаете, как я могу указать имя файла для библиотеки вместо этой странной замены?

Заранее спасибо

1 Ответ

0 голосов
/ 17 мая 2018

Элементы в переменной LIBS предназначены для того, чтобы быть основополагающей частью каждой вашей библиотеки. SCons добавит к ним префикс и суффикс (LIBLINKPREFIX и LIBLINKSUFFIX соответственно) автоматически при компиляции окончательной команды "link".

В вашем случае вы просто должны добавить опцию "-l:kntlm.so" к переменной LINKFLAGS напрямую:

env = Environment()

hello = env.Program(["hello.cc"], LIBPATH=['.'], LINKFLAGS=['-l:kntlm.so'])

Обратите внимание, что это больше не зависит от платформы ... в этом весь смысл использования списка LIBS при нормальных обстоятельствах.

И да, Руководство пользователя говорит вам не устанавливать опцию "-l" через "LINKFLAGS", но это исключение из правила по умолчанию .

Наконец, если вы создаете общие библиотеки, вам придется использовать SHLINKFLAGS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...