2013-09-27 120 views
1

我知道您在想什么 - 这已被答复了一百万次。我希望我可以在标题中加入一些内容,以清楚说明我已经知道图书馆的顺序很重要。对静态库中存在的成员函数的未定义引用

我在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位上很好)。

正如你所看到的,我已经尝试了很多东西,但还没有弄明白。我需要别的东西来尝试!或者有人指出一些非常容易的事情,我做错了。

+0

将'-Wall -g'传递给'g ++' –

+0

噢,我们绝对使用-Wall。没有警告。我想加入-Wextra来获得更多,但我没有时间。 – Hieronymus

+0

我刚刚在我的测试中尝试过--Wall和-Wextra,根本没有任何警告。叹。 – Hieronymus

回答

4
undefined reference to `PTimer::SetNotifier(PNotifierTemplate<int> const&)' 

         PTimer::SetNotifier(PNotifierTemplate<long> const&) 

注意在intlong区别?

+0

宾果!我错过了模板参数中的细微差别。该库是用一组定义构建的,但是当为它包含头文件时,我们的程序没有使用相同的定义。所以INT被定义为int,一个是long,另一个是long。 – Hieronymus

+0

@Hieronymus:这不是我......编译器和链接器是检测到问题的那个! –

+0

嗯,它检测到它,但它并没有告诉我如何解决它:) – Hieronymus

相关问题