这是一个示例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 env变量都没有设置,或者 任何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变量,但如果项目在sub_directories中有一个包含多个共享库的目录层次结构,则会变得很麻烦。
GNU autotools / libtool通过自动将可执行文件的RPATH设置到项目目录中构建共享库的任何位置来解决这个问题,这样可以在开发时轻松运行/测试可执行文件。它在安装时重新链接可执行文件,以省去那些不再需要的RPATH。
是否有类似于autotools可以用scons完成的任何操作,以便在开发时轻松测试可执行文件?
有没有推荐的方法使用带有scons的共享库来构建应用程序,这样可以很容易地从构建目录运行可执行文件?
答案 0 :(得分:2)
您可以修改生成库的每个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
。
答案 1 :(得分:0)
看起来你正在寻找scons中的RPATH
选项。
在维基页面中,RPATH被描述为scons如下。
运行程序时搜索共享库的路径列表。 目前仅用于GNU链接器(gnulink)和IRIX链接器 (sgilink)。在不支持它的平台和工具链上忽略。 请注意,添加到RPATH的路径不会被任何scons转换 方式:如果你想要一个绝对的路径,你必须自己绝对。