【问题标题】:symbol lookup error符号查找错误
【发布时间】:2011-09-16 17:20:40
【问题描述】:

我正在 Ubuntu 下用 C++ 编写一个共享库。源代码包含两个文件:ClassA.h 和 ClassA.cpp。以下为部分内容:

ClassA.h:

namespace calss_a{
class ClassA{
public:
   ...
   void foo(int nBlockIndex);
   ...
}
}

ClassA.h:

namespace calss_a{
    ...
   void classA::foo(int nBlockIndex){printf("....");}
    ...
}

以上源码编译后的.so文件在test.cpp中使用如下:

...
class_a::ClassA * ptr = new class_a::ClassA();
...
ptr->foo(0);
...

但是,从 test.cpp 构建的可执行文件运行时,出现如下错误:

符号查找错误:/home/hzhu/test:未定义符号:_ZN16class_a15ClassA16fooEj

但是如果我在 ClassA.cpp 和 ClassA.h 中将 foo() 的参数“nBlockIndex”的类型从“int”更改为“unsigned in”,然后重新编译 .so 文件,那么问题就消失了。在进一步的实验中,参数“nBlockIndex”的类型仍然定义为“int”,但在 test.cpp 中我这样称呼“foo”:

ptr->foo(1); //pass 1 instead of 0

然后问题也消失了。

谁能告诉我这里发生了什么?

谢谢。

【问题讨论】:

  • 您的第一个 sn-p 中有拼写错误:calss_a 而不是 class_a。
  • 你能发布“_ZN16class_a15ClassA16fooEj”的解构形式吗? (我的 GNU c++filt 无法 demangle)您还可以检查可执行文件中的未定义符号吗?当我收到此错误时,我通常会找到预期的符号(未损坏的版本)与提供的符号。您可以在 .so 和可执行文件上运行 nm 以获取此信息..
  • 第二个 sn-p 中也有同样的错字。
  • 如果您的实际代码的拼写一致性与您问题中的一致性相同,我想我们已经有了答案。不只是 calss_a/class_a 的事情,还有大小写的变化。
  • 三个小时后,我们没有任何澄清。您已经提供了四个非常简短的代码示例,这些示例可能与您实际编写的内容相似 - 但不是来自您的代码,因为在这种情况下,所有名称都将统一拼写和大写。这里没有足够的信息来做任何事情。投票结束。

标签: c++ lookup symbols


【解决方案1】:

我自己对这种事情有点陌生,但我也遇到了符号查找错误,所以想分享一下我的发现。

符号查找错误的问题通常是在两个不同的地方以两种不同的方式定义某些东西。如果你这样做了

 nm -u your-executable | grep undefined-symbol

然后你会发现在目标文件或可执行文件中使用的符号是在哪里定义的

【讨论】:

    猜你喜欢
    • 2017-07-12
    • 2018-02-09
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2017-01-06
    相关资源
    最近更新 更多