2016-07-13 47 views
0

我試圖用G ++,這些文件同時依賴於libxml2和GSL庫的問題,whene我給編譯命令
g++ -Wall -I/usr/include/libxml2 -lgsl main.cpp YUNucNet.cpp src/*.cpp -lxml2 -lm未定義的參考`gsl_vector_free」

它alaways給編譯一些C++文件我很多鏈接錯誤的未定義參考gsl

'/tmp/ccCJrl0t.o: In function `WnSparseSolve__Phi__solve: 
WnSparseSolve.cpp:(.text+0x24bc): undefined reference to `gsl_vector_calloc' 
WnSparseSolve.cpp:(.text+0x24cc): undefined reference to `gsl_vector_calloc' 
WnSparseSolve.cpp:(.text+0x24e9): undefined reference to `gsl_vector_calloc' 
WnSparseSolve.cpp:(.text+0x24ff): undefined reference to `gsl_vector_alloc' 
WnSparseSolve.cpp:(.text+0x250f): undefined reference to `gsl_vector_calloc 
....etc 

這裏有什麼問題??

+1

可能的重複[爲什麼庫的鏈接順序有時會導致GCC錯誤?](http://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-正在連接 - 有時因 - 錯誤 - 在-GCC) –

回答

1

長話短說:庫-lgsl必須在命令行的CPPS之後,即:

g++ -Wall -I/usr/include/libxml2 main.cpp YUNucNet.cpp src/*.cpp -lxml2 -lgsl -lm 

你可以調用G ++與選項-v看到引擎蓋下會發生什麼,比你會看到,在編譯目標文件之前,鏈接器被調用-lgsl。因此,在目標文件之前鏈接器將繼續執行庫,並且鏈接器將丟棄庫中的所有函數,因爲直到現在它不知道它們是需要的。之後,通過處理目標文件,它會知道庫中的函數確實是需要的,但是已經太晚了。