我知道您在想什麼 - 這已被答覆了一百萬次。我希望我可以在標題中加入一些內容,以清楚說明我已經知道圖書館的順序很重要。對靜態庫中存在的成員函數的未定義引用
我在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