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

时间:2014-07-03 22:16:06

标签: c linux scons

这是一个示例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的共享库来构建应用程序,这样可以很容易地从构建目录运行可执行文件?

2 个答案:

答案 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转换   方式:如果你想要一个绝对的路径,你必须自己绝对。