当前位置: 首页 > article >正文

undefined symbol: _ZN5boost15program_options22error_with_option

log: undefined symbol: _ZN5boost15program_options22error_with_option_name15set_option_nameERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

这种报错都是因为 编译链接阶段运行阶段 看到的lib不一致导致的。

root cause:

  1. 编译阶段用了 -I(大写的i)/xxx/boost/boost-1.80.0版本的boost库,并且 -L/xxx/boost/boost-1.80.0/linuxlib, -l(小写的L)boost_program_options。这个地方的问题在于:
    • /xxx/boost/boost-1.80.0 目录下,只有 boost_program_options.a, 没有对应的 .so。并且/xxx/boost/boost-1.80.0/linuxlib不在LD_LIBRARY_PATH列表里(当然在列表里也没有用,因为没有对应的.so)。
    • 在系统的默认搜索路径/lib64目录下,找到了 boost_program_options.so,于是编译出来的 out.so 就认为自己需要/lib64目录下的boost_program_options.so(这是当ldd out.so的时候,其输出显示其依赖一个低版本的boost的原因)。
    • gcc manual明确说了优先使用 .so, 参考这里

      -l library
      If both static and shared libraries are
      found, the linker gives preference to linking with the shared library unless the
      -static option is used.

  2. 在运行阶段,于是就报错undefined symbol

解决方法:

法1:很简单,找一个1.80.0版本的boost_program_options.so,把其路径加到LD_LIBRARY_PATH里。
法2:链接阶段如果想使用.a的时候,不需要-L/-l, 直接在link阶段,像加一个 .o 那样,直接 g++ file1.o file2.o /xx/boost_program_options.a 去显示的使用 .a

总结:

系统的默认搜索路径/lib64下有一个boost_program_options.so是原罪,如果没有的话,在链接阶段-L/-l的时候,因为没有找到libboost_program_options.so, 所以会去转而使用boost_program_options.a, 这个 .a文件在/xxx/boost/boost-1.80.0目录下是存在的,也就避免了上面这一系列的问题。


http://www.kler.cn/a/229003.html

相关文章:

  • MySQL面试题2025 每日20道
  • FPGA车牌识别
  • 计算机网络 (41)文件传送协议
  • Redis 性能优化:多维度技术解析与实战策略
  • 深入了解卷积神经网络(CNN):图像处理与深度学习的革命性技术
  • 03JavaWeb——Ajax-Vue-Element(项目实战)
  • 类银河恶魔城学习记录1-6 Flip基本设置源代码 P33
  • 网络原理TCP/IP(5)
  • ensp实验合集(二)
  • 创建自己的Hexo博客
  • 第8章 多线程
  • Postgresql体系结构
  • 【PTA函数题】6-2 约瑟夫环之循环链表
  • Hack The Box-Challenges-Misc-M0rsarchive
  • 【数据结构与算法】(7)基础数据结构之双端队列的链表实现、环形数组实现示例讲解
  • echarts使用之柱状图(一)
  • LeetCode--代码详解 2.两数相加
  • linux+rv1126/imx6ull:opencv静态库交叉编译(手把手百分百成功)
  • 每周AI新闻(2024年第5周)ChatGPT等多应用登陆 Vision Pro | 字节Coze国内版上线等
  • 小程序中picker多列选择器
  • Git工作中常用命令
  • 【Shell的运行原理以及Linux当中的权限问题】
  • Web后端:CSRF攻击及应对方法
  • Profinet转CANopen主站网关与堡盟编码器通讯案例
  • Spring Boot 依赖管理:spring-boot-dependencies vs spring-boot-starter-parent
  • 基于tidevice实现iOS app自动化使用详解