如何使用Scons链接已编译的.so库(以libgit2为例)
如何在Scons中使用已编译的共享库(以libgit2.so为例)
没问题,我来帮你搞定在Scons里用预编译的libgit2.so这事儿!其实Scons对这种场景支持得很好,只是文档里这块儿没单独拎出来讲透。下面分几步来操作,很容易上手:
1. 告诉Scons去哪里找头文件
首先,你的代码肯定要包含libgit2的头文件(比如#include <git2.h>),所以得让Scons知道这些头文件的位置。如果libgit2是你自己编译的(不是系统默认安装的),就用CPPPATH来添加路径:
env.Append(CPPPATH=['/path/to/libgit2/include'])
把/path/to/libgit2/include替换成你实际的头文件目录,比如如果是放在项目根目录下的libgit2/include,就写./libgit2/include。如果是系统默认安装的(比如/usr/include),这一步可以跳过。
2. 指定共享库的搜索路径
如果你的libgit2.so不在系统标准库路径(比如/usr/lib、/usr/local/lib)里,得告诉Scons去哪里找这个.so文件。用LIBPATH来添加路径:
env.Append(LIBPATH=['/path/to/libgit2/lib'])
同样,替换成你实际的库文件目录,比如./libgit2/lib。要是库在系统标准路径里,这一步也可以省略。
3. 链接共享库生成可执行文件
最后一步就是把你的代码和libgit2.so链接起来。这里要注意,Scons里指定库的时候,要去掉前面的lib和后面的.so,所以libgit2.so对应的库名是git2。用LIBS参数来指定:
env.Program('your_program_name', source=['your_source_files.c'], LIBS=['git2'])
完整的SConstruct示例
给你一个完整的配置示例,方便你参考:
# 初始化构建环境 env = Environment() # 添加libgit2的头文件路径 env.Append(CPPPATH=['./libgit2/include']) # 添加libgit2的库文件路径 env.Append(LIBPATH=['./libgit2/lib']) # 可选:添加rpath,让可执行文件运行时自动找到库路径 env.Append(LINKFLAGS=['-Wl,-rpath=./libgit2/lib']) # 生成可执行文件并链接libgit2 env.Program( target='my_git_tool', source=['main.c'], LIBS=['git2'] )
额外注意事项
- 运行生成的可执行文件时,如果系统找不到libgit2.so,除了上面示例里加
rpath的方法,你还可以临时设置环境变量:export LD_LIBRARY_PATH=/path/to/libgit2/lib,然后再运行程序。 - 如果你需要链接多个共享库,直接在
LIBS里添加多个库名就行,比如LIBS=['git2', 'curl']。
内容的提问来源于stack exchange,提问作者Aaron Franke
相关产品推荐
相关产品推荐

