gpt4 book ai didi

c - 项目目录中的 scons 可执行文件 + 共享库

转载 作者:太空狗 更新时间:2023-10-29 11:08:56 27 4
gpt4 key购买 nike

这是一个示例 SConscript 文件:

env = Environment()
hello_lib = env.SharedLibrary('hello', ['libhello.c'])
exe = env.Program('main', ['main.c'], LIBS=hello_lib)

env.Install('/usr/lib', hello_lib)
env.Install('/usr/bin', exe)
env.Alias('install', '/usr/bin')
env.Alias('install', '/usr/lib')

它构建了一个共享库,以及一个链接到该库的可执行文件:

$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
gcc -o libhello.os -c -fPIC libhello.c
gcc -o libhello.so -shared libhello.os
gcc -o main.o -c main.c
gcc -o main main.o libhello.so
scons: done building targets.

现在,问题是创建的可执行文件在从项目目录运行时找不到共享库,这是很自然的,因为既没有设置 LD_LIBRARY_PATH 环境变量,也没有在可执行文件中设置任何 RPATH:

[fedora 00:07:10 2 ~] $ ./main 
./main: error while loading shared libraries: libhello.so: cannot open shared object file: No such file or directory

我总是可以在开发时设置 LD_LIBRARY_PATH 变量,但如果项目的目录层次结构在子目录中有多个共享库,这会变得很麻烦。

GNU autotools/libtool 通过自动将可执行文件的 RPATH 设置为项目目录中构建共享库的任何位置来解决此问题,这样可以在开发时轻松运行/测试可执行文件。并且它会在安装时重新链接可执行文件以省略那些不再需要的 RPATH。

是否有任何类似 autotools 的功能可以用 scons 完成以在开发时简化对可执行文件的测试?

是否有任何推荐的方法来使用带有 scons 的共享库来构建应用程序,这使得从构建目录运行可执行文件变得容易?

最佳答案

您可以修改生成库的每个 SConscript 文件,如下所示:

hello_lib = env.SharedLibrary('#/lib/hello', ['libhello.c'])

您所有的共享库现在都位于一个目录中。

生成可执行文件的 SConscript 变为:

exe = env.Program('main', ['main.c'], LIBPATH='#/lib', LIBS=hello_lib)

然后您就可以将 LD_LIBRARY_PATH 设置为 $PWD/lib

关于c - 项目目录中的 scons 可执行文件 + 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24564078/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com