【发布时间】: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 的事情,还有大小写的变化。
-
三个小时后,我们没有任何澄清。您已经提供了四个非常简短的代码示例,这些示例可能与您实际编写的内容相似 - 但不是来自您的代码,因为在这种情况下,所有名称都将统一拼写和大写。这里没有足够的信息来做任何事情。投票结束。