使用 Scons 的文件名链接特定的共享库

Linking with an specific shared library using its filename with Scons

我正在使用 SCons 构建一个库。

我要链接的库的文件名不是以通常的 "lib" 前缀开头。

我阅读了 ld 文档并检查了我的控制台 运行ning GCC,如果我输入 -l:filename.so 将通过指定的库路径搜索名为 "filename.so" 的库。

当我在我的 SConscript 文件中尝试这个解决方案时,显然 Scons 保留了库名称前面的冒号,但它删除了“.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.

如你所见,Scons执行的GCC包含了“-l:kntlm”,但是去掉了末尾的“.so”,所以找不到库文件

你知道如何为库指定文件名而不是这个奇怪的替换吗?

提前致谢

LIBS 变量中的项目仅作为每个库的主干部分。 SCons 将在编译最终的 "link" 命令时自动为其添加前缀和后缀(分别为 LIBLINKPREFIXLIBLINKSUFFIX

在您的情况下,您应该直接将“-l:kntlm.so”选项添加到变量 LINKFLAGS

env = Environment()

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

请注意,这不再与平台无关...这就是在正常情况下使用 LIBS 列表的全部意义所在。

是的,User Guide 告诉您 不要 通过“LINKFLAGS”设置“-l”选项,但是这个是默认规则的例外。

最后,如果您创建共享库,则必须改用 SHLINKFLAGS