2013-09-27 51 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

相關問題