已安装libboost仍编译报错,无需-L/usr/lib如何解决?
解决Boost库编译时未定义引用问题(无需手动指定-L/usr/lib)
问题背景
你系统中同时存在两个路径的Boost库:
amov@amov:~$ locate libboost_system.so /usr/lib/libboost_system.so /usr/lib/libboost_system.so.1.60.0 /usr/local/lib/libboost_system.so /usr/local/lib/libboost_system.so.1.60.0
直接执行编译命令时出现未定义引用错误:
amov@amov:~$ g++ -o example example.cc -lboost_system /usr/bin/ld: /tmp/ccaVHCGA.o: in function `main': example.cc:(.text+0xac): undefined reference to `boost::system::generic_category()' /usr/bin/ld: /tmp/ccaVHCGA.o: in function `__static_initialization_and_destruction_0(int, int)': example.cc:(.text+0x1f2): undefined reference to `boost::system::generic_category()' /usr/bin/ld: example.cc:(.text+0x1fe): undefined reference to `boost::system::generic_category()' /usr/bin/ld: example.cc:(.text+0x20a): undefined reference to `boost::system::system_category()' /usr/bin/ld: /tmp/ccaVHCGA.o: in function `boost::system::error_code::error_code()': example.cc:(.text._ZN5boost6system10error_codeC2Ev[_ZN5boost6system10error_codeC5Ev]+0x1b): undefined reference to `boost::system::system_category()' collect2: error: ld returned 1 exit status
但指定-L/usr/lib后编译成功,核心原因是链接器默认优先搜索/usr/local/lib,但该路径下的Boost库与你的代码编译依赖的符号不匹配。
解决方法
1. 临时调整链接器搜索优先级
在终端中执行以下命令,让/usr/lib的优先级高于/usr/local/lib,之后直接编译即可:
export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH g++ -o example example.cc -lboost_system
这个设置仅在当前终端会话生效,关闭终端后恢复原样。
2. 永久调整搜索优先级
编辑你的shell配置文件(比如~/.bashrc或~/.zshrc),添加以下内容:
export LD_LIBRARY_PATH=/usr/lib:$LD_LIBRARY_PATH
保存后执行source ~/.bashrc(对应你修改的配置文件),之后所有终端会话都会生效。
3. 调整系统链接器配置(推荐)
修改系统级的链接器搜索路径顺序:
- 编辑
/etc/ld.so.conf文件(需要sudo权限),确保/usr/lib在/usr/local/lib之前 - 执行
sudo ldconfig更新链接器缓存
之后编译时无需任何额外参数即可正常链接。
4. 移除/usr/local/lib下的Boost库(如果不需要)
如果你不需要/usr/local/lib下的Boost版本,直接删除相关文件:
sudo rm /usr/local/lib/libboost_system.so*
之后链接器会自动使用/usr/lib下的库。
5. 静态链接Boost库
编译时加上-static参数,强制静态链接Boost库,避免动态库路径问题:
g++ -o example example.cc -lboost_system -static
注意:静态链接会生成更大的可执行文件,且可能依赖系统其他静态库。
内容的提问来源于stack exchange,提问作者sce
相关产品推荐
相关产品推荐

