这是一个示例 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/