FlightGear編譯小結

養成寫Blog的習慣,把平時遇到的一些有價值的事情記錄下來,這並不是每個人都能做到的。由於推免沒能推到自己第一想要的方向,退而求其次,我就來到嵌入式方向,並且畢業設計也在這邊的實驗室做,安排的任務跟計算機圖形有關係,更具體一點跟飛行模擬器(Flight Simulator)有關係,這樣就接觸了FlightGear。編譯FlightGear確實是一件費心的事情,下面記錄一點跟編譯過程有關的事項,注意要想成功編譯FlightGear,只看我這個小結是萬萬不能的,因爲與每個人選擇的FlightGear、Simgear、OpenSceneGraph、3rdParty、plib、編譯工具以及操作系統都有關係。

當決定要編譯FlightGear時,第一件要做的事情是確定要編譯的FlightGear是什麼版本,然後決定別的依賴庫採用什麼版本。這裏我選擇FlightGear 1.9.1,需要使用Simgear 1.9.1來編譯FlightGear 1.9.1,OpenSceneGraph的版本是2.8.1,plib的版本必須是1.8.5或者以上。當確定了這些以後,我們就需要知道這些依賴庫放置在哪裏才能使得編譯FlightGear時能夠找得到,此時可以參考網上的一些例子,但是更好的方法是打開FlightGear源代碼裏面的解決方案文件,例如我打開FlightGear 1.9.1源代碼裏面的FlightGear.sln(flightgear/projects/VC8):

image

就只有4個項目。右擊FlightGear查看其屬性->C/C++->常規,有一個附加包含目錄:

image 看看這些值,就知道應該把依賴庫的包含文件放在哪裏。當然我們也可以改變這些值,然後再把包含文件放在相應改變後的位置,只要編譯時找得到就OK。同時還有鏈接時的依賴庫的lib文件的位置(屬性->鏈接器->常規):

image這樣在出現問題時就不會擔心是不是因爲把相關文件放錯位置了。

真正開始編譯時,所謂的順序其實就是先把相關包含文件和lib文件編譯出來,這樣在編譯FlightGear 1.9.1時不會出現編譯錯誤以及後面的生成階段時不會出現鏈接錯誤。查看屬性->鏈接器->輸入:

FlightgearLib.lib
Simgear.lib
fnt.lib
js.lib
net.lib
psl.lib
puAux.lib
pui.lib
pw.lib
sg.lib
sl.lib
ul.lib
osgDBd.lib
osgGAd.lib
osgViewerd.lib
osgUtild.lib
osgParticled.lib
osgTextd.lib
osgd.lib
OpenThreadsd.lib
libjpeg.lib
pthreadvc2.lib
Alut.lib
openal32.lib
glu32.lib
opengl32.lib
winmm.lib
zlib.lib
wsock32.lib
advapi32.lib
comdlg32.lib
shell32.lib
user32.lib

我們一個任務是要湊集這些lib文件,這就是那些依賴的庫。FlightGearLib.lib與Simgear.lib就是上面4個項目中其中二個項目做的事情。而fnt.lib到ul.lib的文件是屬於plib的,所以就開始編譯plib吧,版本是1.8.5。然後接下來以osg開頭的以及OpenThreadsd.lib都是OpenSceneGraph的,後面都有一個d說明是debug版本,沒有d是release版本,然後是libjpeg.lib,這是需要單獨編譯的,不過如果不怕也可以直接從網上搜索下載,pthreadvc2.lib也是如此,我就是直接從網上搜索下載回來的,alut.lib、openal32.lib、opengl32.lib、zlib.lib也是需要專門編譯,都是相互獨立的庫。編譯鏈接時需要這些就夠了,但是如果要能夠運行起來,還需要path指向相關的dll文件,這些文件是編譯相關庫產生的,把路徑追加到PATH變量就好了。

最後編譯FlightGear時,有一個事項要闡述一下。就是工程裏面有些文件在磁盤上是不存在的,此時就會報c1xx錯誤,消除這些錯誤就是在工程裏面把相關文件刪除,然後鏈接時就有許多的”找不到符號”的錯誤,這是因爲磁盤上有該文件,只是沒有加到工程裏面來,所以就根據符號找到定義它的文件,然後加到工程裏面來,最後需要忽略msvcrt.lib、libcmt.lib這兩個庫文件,到這裏你就可以飛起來了。

希望給編譯FlightGear的朋友們一點幫助。如有疑惑,歡迎交流,倘有錯誤之外,懇請指正。

胡靖飛

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章