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') 

它build立一个共享库,一个可执行文件链接到该库:

 $ 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. 

现在,问题是创build的可执行文件在从项目目录运行时找不到共享库,这是非常自然的,因为既不设置LD_LIBRARY_PATH envvariables,也不在可执行文件中设置任何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_PATHvariables,但如果项目在子目录中具有多个共享库的目录层次结构,则会变得非常麻烦。

GNU autotools / libtool通过将可执行文件的RPATH自动设置到项目目录中的共享库的任何位置来解决这个问题,这允许在开发时轻松地运行/testing可执行文件。 并且在安装时重新链接可执行文件以省去那些不再需要的RPATH。

有什么类似于自动工具可以用scons来完成的任务,以便在开发时轻松testing可执行文件?

有什么推荐的方法来build立与scons共享库的应用程序,可以很容易地从build目录运行可执行文件?

您可以修改生成库的每个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

看起来您正在寻找scons中的RPATH选项。

在wiki页面中,RPATH被描述为scons,如下所示。

运行程序时搜索共享库的路径列表。 目前仅在GNU链接器(gnulink)和IRIX链接器(sgilink)中使用。 忽略不支持的平台和工具链。 请注意,添加到RPATH的路径不会被scons转换:如果你想要一个绝对路径,你必须自己决定绝对路径。