我知道您在想什么 - 这已被答复了一百万次。我希望我可以在标题中加入一些内容,以清楚说明我已经知道图书馆的顺序很重要。对静态库中存在的成员函数的未定义引用
我在CentOS 6 64.使用克++我有一个简单的测试程序:
#include <ptlib.h>
int main()
{
PTimer indirectTimer1_;
indirectTimer1_.SetNotifier(0);
return 0;
}
和予编译并与此命令链接它:
g++ -I./ptlib/include/ mm.cpp ptlib/lib_linux_x86_64/libpt_s.a -lpthread -lrt
和我得到这个作为答案回:
/tmp/cc53itXb.o: In function `main':
mm.cpp:(.text+0x52): undefined reference to `PTimer::SetNotifier(PNotifierTemplate<int> const&)'
collect2: ld returned 1 exit status
但我知道,PTimer :: SetNotifier是在某文件:
nm -AC ptlib/lib_linux_x86_64/libpt_s.a | grep SetNotifier
ptlib/lib_linux_x86_64/libpt_s.a:osutil.o:0000000000003dd8 T PTimer::SetNotifier(PNotifierTemplate<long> const&)
更麻烦的是,当我在Centos 5,32位上编译库并运行相同的测试时,它链接的很好。
我试过使用'-Lptlib/lib_linux_x86_64 -lpt_s',我尝试过使用-Wl, - 开始组//-Wl, - 结束组参数无济于事。如果我将'ptlib/src/ptlib/unix/osutil.cxx'添加到g ++行,它编译和链接就好了。不幸的是,这只是我们主程序中未引用函数的一个示例。并非所有的,只是像这样一些看似随机的方法是未定义的(这也链接在Centos 5,32位上很好)。
正如你所看到的,我已经尝试了很多东西,但还没有弄明白。我需要别的东西来尝试!或者有人指出一些非常容易的事情,我做错了。
将'-Wall -g'传递给'g ++' –
噢,我们绝对使用-Wall。没有警告。我想加入-Wextra来获得更多,但我没有时间。 – Hieronymus
我刚刚在我的测试中尝试过--Wall和-Wextra,根本没有任何警告。叹。 – Hieronymus