使用 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" 命令时自动为其添加前缀和后缀(分别为 LIBLINKPREFIX
和 LIBLINKSUFFIX
。
在您的情况下,您应该直接将“-l:kntlm.so
”选项添加到变量 LINKFLAGS
:
env = Environment()
hello = env.Program(["hello.cc"], LIBPATH=['.'], LINKFLAGS=['-l:kntlm.so'])
请注意,这不再与平台无关...这就是在正常情况下使用 LIBS
列表的全部意义所在。
是的,User Guide 告诉您 不要 通过“LINKFLAGS
”设置“-l
”选项,但是这个是默认规则的例外。
最后,如果您创建共享库,则必须改用 SHLINKFLAGS
。
我正在使用 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" 命令时自动为其添加前缀和后缀(分别为 LIBLINKPREFIX
和 LIBLINKSUFFIX
。
在您的情况下,您应该直接将“-l:kntlm.so
”选项添加到变量 LINKFLAGS
:
env = Environment()
hello = env.Program(["hello.cc"], LIBPATH=['.'], LINKFLAGS=['-l:kntlm.so'])
请注意,这不再与平台无关...这就是在正常情况下使用 LIBS
列表的全部意义所在。
是的,User Guide 告诉您 不要 通过“LINKFLAGS
”设置“-l
”选项,但是这个是默认规则的例外。
最后,如果您创建共享库,则必须改用 SHLINKFLAGS
。