2013-01-16 246 views
0

此問題不是特定於Fubi,而是一般鏈接器問題。這幾天(讀作5)已經充滿了鏈接錯誤,但我已經設法將其縮小到僅有的幾個。嘗試編譯Fubi時鏈接錯誤

我想在Linux環境下編譯Fubi(全身交互框架)。它僅在Windows 7上進行過測試,並且網絡缺乏在* nix平臺上編譯的資源。

現在,就像我上面提到的,我有大量的鏈接問題,主要涉及不正確的g ++標誌。 Fubi需要OpenNI和NITE(以及OpenCV,如果你願意的話)才能提供它的基本功能。我已經能夠成功編譯來自OpenNI和NITE框架的兩個樣本。

據我所知,Fubi是一個框架,因此我需要編譯一個共享庫而不是二進制文件。

當我嘗試使用下面的命令

g++ *.cpp -lglut -lGL -lGLU -lOpenNI -lXnVNite_1_5_2 -I/usr/include/nite -I/usr/include/ni -I/usr/include/GL -I./GestureRecognizer/ -o FubiBin 

到其編譯爲二進制文件,我得到位於here輸出。 (這是很長的,我不想破壞格式)

如果我反而編譯成目標文件(-c標誌),沒有錯誤出現,它成功地建立目標文件。請注意,我用下面的命令:

g++ -c *.cpp -lglut -lGL -lGLU -lOpenNI -lXnVNite_1_5_2 -I/usr/include/nite -I/usr/include/ni -I/usr/include/GL -I./GestureRecognizer/ 

我然後我能夠使用ar命令生成靜態鏈接庫。沒有錯誤[可能]發生(這只是我的一個猜測),因爲它還沒有通過鏈接器運行,所以這些錯誤不會出現。

感謝您的耐心和閱讀所有這一切。最後,提問時間:

1)試圖編譯爲二進制文件時,關於未定義引用主正常的第一個錯誤?我搜索了該文件夾內的所有文件,並且沒有一個主要函數存在。

2)未定義的參考錯誤的其餘部分抱怨說,他們無法找到提到的功能。所有這些函數都位於子目錄GestureRecognizer/中的.cpp和.h文件中,該文件是我正在編譯的路徑的子目錄。因此,參數-I./GestureRecognizer/是否可以解決此問題?

我想確保在創建共享庫時我不會在運行時遇到任何鏈接問題。當所有這些錯誤在嘗試編譯爲二進制文件時是否會消失,如果它們最初鏈接正確?

回答

0

您正在告訴編譯器在第一次調用時創建一個可執行文件,而可執行文件需要一個main()函數,它找不到它。所以不,錯誤是不正常的。爲了創建一個共享庫,使用GCC的「共享」選項。在這裏嘗試一些測試代碼,在我的系統上編譯時也想要「-fPIC」,但這可能會有所不同。最好的辦法是仔細研究這個正確生成系統上的其他一些庫的編譯器和鏈接器的命令行。

爲了從子目錄添加缺少的符號,你必須編譯這些,太:g++ *.cpp ./GestureRecognizer/*.cpp ...。該「-I ...「只告訴編譯器在哪裏,當它發現一個#include ...搜索,我不會感到驚訝,如果這甚至不是必要的,很多項目都使用#include "GestureRecognizer/Foo.h"直接實現這一

BTW:

  • 考慮運行時,編譯器(「-W ...」)激活警告。
  • 你可以編譯(「-c」)和鏈接之間的分裂。在這兩種情況下,使用「G ++」,雖然這應該減少您的週轉時間測試不同的連接器設置。
+0

啊,這是問題。我並沒有包括'GestureRecognizer/*。cpp'所以這些錯誤消失。謝謝你的協助。順便說一句,這個項目不需要你評論有關'-I ......」的一部分。同時,感謝您的鏈接提示。這是非常新的給我,所以我真的很感激。 – soplu