linux下gcc编译使用opencv的源文件时报错的处理:undefined reference to symbol '_ZNSsD1Ev@@GLIBCXX_3.4'

这阵子用opencv的sift做了一下匹配,在使用gcc编译时遇到这样的一个报错


  /usr/bin/ld: /tmp/cceCEx1F.o: undefined reference to symbol '_ZNSsD1Ev@@GLIBCXX_3.4'

 //usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line

collect2: error: ld returned 1 exit status


一开始就去查找了符号'_ZNSsD1Ev@@GLIBCXX_3.4',Direct Sparse Odometry(DSO),但都并没有什么用,其实解决方案很简单:命令行gcc改为使用g++编译

_ZNSt19istreambuf_iteratorIcSt11char_traitsIcEEppEv@GLIBCXX_3.4 GLIBCXX_3.4.28 _ZNSs7_M_copyEPcPKcm@GLIBCXX_3.4 GLIBCXX_3.4.25 _ZNSt19istreambuf_iteratorIcSt11char_traitsIcEEppEv@@GLIBCXX_3.4.5 _ZNSs7_M_moveEPcPKcm@@GLIBCXX_3.4.5 _ZNKSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4 _ZNKSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@GLIBCXX_3.4 _ZNSbIwSt11char_traitsIwESaIwEE4_Rep26_M_set_length_and_sharableEm@@GLIBCXX_3.4.5 _ZNSs4_Rep26_M_set_length_and_sharableEm@GLIBCXX_3.4 _ZSt10defer_lock@@GLIBCXX_3.4.11 _ZN10__gnu_norm15_List_node_base4swapERS0_S1_@@GLIBCXX_3.4 _ZNSs9_M_assignEPcmc@@GLIBCXX_3.4.5 _ZNKSbIwSt11char_traitsIwESaIwEE15_M_check_lengthEmmPKc@@GLIBCXX_3.4.5 _ZNKSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4.5 _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwm@GLIBCXX_3.4 GLIBCXX_3.4.24 _ZNVSt9__atomic011atomic_flag12test_and_setESt12memory_order@@GLIBCXX_3.4.11 GLIBCXX_3.4.20 _ZNSt11char_traitsIwE2eqERKwS2_@@GLIBCXX_3.4.5 GLIBCXX_3.4.12 _ZNSi6ignoreEv@@GLIBCXX_3.4.5 GLIBCXX_3.4.2 _ZNSt11char_traitsIcE2eqERKcS2_@@GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.15 _ZNKSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4.5 _ZNSs9_M_assignEPcmc@GLIBCXX_3.4 GLIBCXX_3.4.19 _ZNKSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv@GLIBCXX_3.4 _ZNSt19istreambuf_iteratorIwSt11char_traitsIwEEppEv@GLIBCXX_3.4 GLIBCXX_3.4.27 _ZN10__gnu_norm15_List_node_base7reverseEv@@GLIBCXX_3.4 _ZN10__gnu_norm15_List_node_base4hookEPS0_@@GLIBCXX_3.4 _ZNSt11char_traitsIwE2eqERKwS2_@GLIBCXX_3.4 _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwm@GLIBCXX_3.4 _ZNSbIwSt11char_traitsIwESaIwEE7_M_copyEPwPKwm@@GLIBCXX_3.4.5 GLIBCXX_3.4.23 GLIBCXX_3.4.3 GLIBCXX_3.4.7 _ZNSi6ignoreEl@@GLIBCXX_3.4.5 _ZNKSbIwSt11char_traitsIwESaIwEE11_M_disjunctEPKw@@GLIBCXX_3.4.5 _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEv@GLIBCXX_3.4 _ZNKSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4.5 _ZNSbIwSt11char_traitsIwESaIwEE7_M_moveEPwPKwm@@GLIBCXX_3.4.5 GLIBCXX_3.4.18 _ZNSb
03-17
<think>好的,我需要帮助用户查找GLIBCXX符号版本列表及其定义。首先,根据用户提供的引用内容,特别是引用[3],里面提到了符号版本脚本和符号在动态链接库中的版本后缀,比如`foo@@VERS_1.1`。这说明GLIBCXX的符号版本信息可能与符号版本脚本有关,而GCC编译处理这些信息。 接下来,引用[4]提到如何查看glibc的版本,但用户的问题是关于GLIBCXX的,这其实是GNU标准C++库(libstdc++)的版本,和glibc不同。需要明确区分两者。GLIBCXX版本对应的是libstdc++.so的版本,而glibc是C标准库。 根据引用[1]和[3],GCC在链接处理C++标准库的符号版本,可能通过版本脚本来定义符号的版本。因此,要获取GLIBCXX的符号版本列表,可能需要查看libstdc++的版本脚本文件,或者使用工具如`nm`或`objdump`来查看库文件中的符号及其版本。 用户可能需要知道如何检查系统中已安装的GLIBCXX版本,可以使用`strings`命令查找libstdc++.so文件中的GLIBCXX版本字符串。例如: ```bash strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX ``` 这将列出所有支持的GLIBCXX版本。 此外,关于符号版本的定义,GCC的文档或libstdc++的源码中可能有详细的版本脚本,这些脚本定义了各个符号对应的版本。用户可能需要查阅GCC的官方文档或源码仓库来获取具体的版本列表和定义。 需要注意的是,不同GCC版本对应的GLIBCXX版本不同,例如GCC 11会引入GLIBCXX_3.4.29,如引用[3]中的错误所示。因此,用户可能需要根据GCC版本来确定可用的符号版本。 最后,确保回答中正确使用LaTeX格式,例如提到版本号不需要数学公式,但若有变量或代码需用行内格式。同生成相关问题要围绕GLIBCXX版本、符号版本检查、版本不匹配解决等方面。</think>### GLIBCXX符号版本列表及定义 GLIBCXX符号版本与GNU标准C++库(libstdc++)的版本紧密相关,每个符号的版本标记了其兼容性和功能演进。以下是相关信息和操作方法: --- #### 1. **查看系统中已支持的GLIBCXX版本** 通过`strings`命令提取`libstdc++.so`库中的版本信息: ```bash strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX ``` 输出示例: ``` GLIBCXX_3.4 GLIBCXX_3.4.1 ... GLIBCXX_3.4.29 ``` 这表示当前系统支持的符号版本范围[^4]。 --- #### 2. **符号版本的定义来源** - **版本脚本(Version Script)**:GCC编译libstdc++使用版本脚本(如`libstdc++-symbols.ver`)定义符号与版本的映射关系。例如: ``` GLIBCXX_3.4.29 { std::vector::reserve(unsigned long); }; ``` 这表示`std::vector::reserve`在GLIBCXX_3.4.29中被引入或修改[^3]。 - **GCC版本对应关系**:每个GCC版本会新增或更新符号版本。例如: - GCC 11.1 引入`GLIBCXX_3.4.29` - GCC 7.1 支持`GLIBCXX_3.4.22` --- #### 3. **检查二进制文件的符号版本依赖** 使用`objdump`查看可执行文件或动态库依赖的符号版本: ```bash objdump -p your_program | grep GLIBCXX ``` 输出会列出所有依赖的符号版本,例如: ``` version need: libstdc++.so.6(GLIBCXX_3.4.29) ``` --- #### 4. **解决版本不匹配问题** 若出现`GLIBCXX_X.X.X not found`错误,需升级libstdc++或重新编译程序: - **方法1**:更新GCC和libstdc++,确保编译环境与运行环境一致。 - **方法2**:静态链接libstdc++(但可能增加二进制体积)[^3]。 --- #### 5. **官方文档与源码** - **GCC官方文档**:提供各版本符号变更记录(见[GCC Release Notes](https://gcc.gnu.org/releases.html))。 - **libstdc++源码**:版本脚本文件位于`libstdc++-v3/config/abi/*/symbol-version`目录[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值