我正在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
然后问题也消失了。
谁能告诉我这里发生了什么?
感谢。
答案 0 :(得分:0)
我自己对这种事情有点新意,但我也遇到了符号查找错误,所以我想我会分享我发现的内容。
符号查找错误的问题通常是在两个不同的地方以两种不同的方式定义某些东西。如果你这样做
nm -u your-executable | grep undefined-symbol
然后您将找到定义目标文件或可执行文件中使用的符号的位置