【问题标题】:C++ runtime symbol lookup error, ubuntuC++ 运行时符号查找错误,ubuntu
【发布时间】:2013-06-03 10:44:17
【问题描述】:

我有一个 C++ 函数 doSth,它将从类“canMsg”中调用一个函数“checkFrame”,如下所示

#include "canMsg.h"  
void doSth(char* canFrame){
    map<int, double> returnedData;
    CANMsg canMsg;
    std::cout<<canFrame <<endl;
    canMsg.checkFrame(canFrame);
}

在编译期间我没有收到任何错误,但是当我运行它时,它会执行 std::cout&lt;&lt;canFrame &lt;&lt;endl; 语句并通过创建错误来崩溃

undefined symbol: _ZNSaIcEC1Ev, version GLIBCXX_3.4

任何想法如何解决这个问题?

【问题讨论】:

  • $ c++filt &lt;&lt;&lt; "_ZNSaIcEC1Ev" std::allocator&lt;char&gt;::allocator()

标签: c++ ubuntu runtime undefined-symbol


【解决方案1】:

我认为如果事情以“错误”的顺序联系起来,就会出现这种问题。我建议您尝试更改您传递给链接器的任何库的顺序。

(我实际上不知道为什么排序很重要 - 但有时确实如此。)

【讨论】:

    【解决方案2】:

    感谢您的回复。该错误是由于我试图返回一个本地声明的指针。在我将局部指针变量更改为静态后,它可以完美运行。基本思想是C++不提倡将局部变量的地址返回到函数外部。

    查看this了解更多信息。

    【讨论】:

    • 应该是段错误,而不是符号查找错误。
    【解决方案3】:

    当依赖库(其中定义了_ZNSaIcEC1Ev id)为您当前拥有的其他版本的 GLIBC(更新版本或更旧版本)编译时,可能会发生此错误。

    尝试使用当前环境重新编译该库。

    您还可以将漂亮的开关添加到您的应用程序的LDFLAGS-Wl,--no-undefined。然后你可以在编译时看到任何未定义的符号(不确定它是否对你的情况有帮助)。

    【讨论】:

    • 检查我的评论,该符号直接来自标准库。真的不想自己重新编译。
    • 我的意思是,Dangila 使用了一些共享库,其中实现了 CANMsg 类(例如 libCANMsg.so)。也许那个库是用不兼容的 GLIBC 版本编译的。
    猜你喜欢
    • 2015-03-15
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多