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

标签 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 环境变量,也没有 在可执行文件中设置任何 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/

相关文章:

c - 为什么在函数 'getAr' 中定义的局部变量可以在 main 中访问?

linux - 创建war文件时的磁盘空间限制

php - 从 shell 启动文件 php

scons - 如何使用 Scons 生成特定的 CPPDEFINE,例如 -DOEM ="FOO BAR"

SCons 能否跟踪链接依赖项?

c - 一个函数正在从另一个函数中提取变量值,但我不希望它这样做,也不知道它是如何做到的

c - 为什么递归返回第一个函数?

c - 这段代码的原型(prototype)声明是什么?

scons - 如何编写具有难以预测的动态源的 SCons 脚本?

php - 如何从 laravel Controller 执行外部 shell 命令?