[轉][JSBSim]使用VS2015編譯JSBSim

轉自csdn
原文:https://blog.csdn.net/yu_lei_/article/details/81463187 git

請你們去看原文,原文有圖片和資源,本文僅供本人蔘考github

權威參考:http://jsbsim.sourceforge.net/Building_JSBSim_with_Visual_Cpp.pdf 編程

 

另外附上此做者的相關博客多線程

JSBSim使用教程 

JSBSim編程實踐

 

 

1.說明函數

最近在研究JSBSim的代碼,首先百度了一些JSBSim相關的文檔和教程,有一篇《Building_JSBSim_with_Visual_Cpp_2010》講了如何利用VS2010編譯JSBSim,參考這個教程編譯完成了一個JSBSim工程。可是這個工程是好多年之前的了,在GitHub上下載的最新JSBSim工程已經沒法使用VS2010來編譯了,因此就用VS2015將JSBSim最新的代碼編譯了一遍,其中配置內容和VS2010略有不一樣,因此記錄下來,以便參考。工具

2.代碼下載
JSBSim項目的代碼下載地址以下:性能

Sourceforge下載地址:https://sourceforge.net/p/jsbsim/code/ci/master/tree/測試

GitHub下載地址:https://github.com/JSBSim-Team/jsbsim/tree/master優化

其中Sourceforge下載地址打開以下圖,在右側的JSBSim版本分支中有三個,分別是master、SG_Path和major_refactor,三個分支應該是不一樣時期的JSBSim版本,其中master應該是比較新的版本,下載後可使用VS2015進行編譯。ui

 

根據SourceForge上的消息,JSBSim在2018年5月份開始遷移到GitHub上了,因此目前JSBSim項目的維護應該是在GitHub上進行着,若是要接觸最新的JSBSim代碼,能夠考慮在GitHub上關注這個項目。

 

3.編譯成可執行文件
下載獲得JSBSim工程包,解壓後打開sln文件,最新的JSBSim工程中sln文件只能用VS2015以上的版本才能打開,打開後的界面以下:

 

目前這個解決方案中包含了三個工程,第一個項目aeromatic是生成飛行器配置xml文件的工具,第三個工程prep_plot是輔助畫圖的工具,在此咱們重點關注JSBSim工程。

在JSBSim工程在編譯前須要進行相應的配置,配置和測試步驟以下:

Step1.右擊JSBSim工程,選擇屬性,打開工程屬性頁


Step2.點擊配置管理器按鈕,進入配置管理器頁面,選擇相應的活動平臺解決方案。其中的x64解決方案平臺是爲了編譯成64位應用程序而使用的,而x86應用程序是爲了編譯成32位應用程序而使用的。在此處咱們選擇x86平臺,解決方案配置選擇Release。


Step3.關閉配置管理器頁面後,在配置屬性->調試頁面下的命令參數一欄輸入「--script=scripts\c1723.xml --outputlogfile=c1723.csv」,這是爲了方便調試所輸入的命令參數。


Step4.在配置屬性 -> C/C++ -> 代碼生成 -> 運行庫一欄,設置運行庫爲多線程(/MT),這樣設置的目的是將VS2015的運行時庫做爲lib連接到應用程序中,程序能夠在沒有安裝VS2015的環境中運行。


Step5.編譯程序,右擊工程選擇生成或者按F7便可開始編譯工程,等待幾分鐘應該就能夠編譯成功了。
Step6.在成功編譯以後,咱們能夠在工程的Release目錄下找到JSBSim.exe,接下來能夠運行測試。能夠經過VS2015來運行JSBSim.exe,結合以前設置的命令行參數,在菜單欄選擇調試->開始執行(不調試)或者按Ctrl+F5便可運行;也能夠在工程目錄下輸入命令行指令來執行。爲了方便,我寫了一個批處理腳本進行測試,腳本內容以下:
del -Q c1723.csv

Release\JSBSim --script=scripts\c1723.xml --outputlogfile=c1723.csv

pause
執行效果以下圖,同時在工程目錄下會生成C1723.csv文件,該文件以表格的形式記錄下了仿真過程當中的全部數據,能夠用來進行分析畫圖或者Replay。

 

 

4.編譯成靜態庫
面向對象的強大之處在於代碼重用很方便,可是咱們無法每次都添加這麼多的JSBSim源代碼到咱們本身的工程之中,因此考慮將JSBSim的代碼編譯成靜態庫來使用,這樣每次只需添加JSBSim的靜態庫就能夠複用其中已有的許多輪子了。編譯配置過程以下:

Step1.打開JSBSim工程屬性頁,在此以前,咱們應該已經在配置管理器中配置好了要編譯的平臺版本了,此處選擇的編譯平臺是Release Win32。接着在常規->配置類型一欄,將編譯目標從應用程序(.exe)改成靜態庫(.lib)。


Step2.接着切換到C/C++ -> 預處理器 -> 預處理器定義一欄,選擇編輯,打開預處理器定義編輯頁面,在最後一行輸入XML_STATIC,這是爲了在工程中預先給出XML_STATIC的宏定義,從而將XML工具相關的API導出


Step3.在屬性頁的C/C++ -> 代碼生成 –> 運行庫一欄設置爲多線程 (/MT)


Step4.在右側工程目錄欄中,找到JSBSim.cpp文件,右擊選擇移除,由於咱們的靜態庫不須要使用main函數。
Step5.編譯成功以後,就能夠在工程目錄下Release目錄下找到編譯完成的JSBSim.lib,這就是咱們所獲得的靜態庫,接下來對咱們的靜態庫進行測試。
Step6.首先在VS2015中新建一個工程,將該工程設置爲空項目,命名爲JSBSimLibTest。因爲VS2015在建立新項目時將.sln文件和. .vcxproj文件分開放了,咱們將其移到同一目錄下,並在sln解決方案中從新添加工程文件。
Step7.拷貝JSBSim工程目錄下的src文件夾和JSBSim.cpp到JSBSimLibTest工程目錄中,同時將咱們以前編譯好的JSBSim.lib拷貝到src目錄中。雖然咱們已經不須要JSBSim的源代碼了,可是頭文件仍是須要的。而JSBSim.cpp則是咱們用來對靜態庫進行測試的調用代碼,看其可否實如今原工程中一樣的功能。
Step8.在JSBSimLibTest工程上右擊->添加->現有項,打開文件選擇窗口,選擇JSBSim.cpp文件。此時能夠在IDE中看到添加後的文件提示了許多錯誤,這是由於咱們尚未配置頭文件包含目錄以及依賴庫的關係。
Step9.打開屬性配置頁面,而後打開配置管理器,配置要編譯的工程目標爲Release,平臺選擇Win32,這是爲了和咱們以前編譯靜態庫時的配置相統一,以避免編譯出錯。
Step10.在工程屬性頁 -> C/C++ -> 常規 -> 附加包含目錄一欄,點擊編輯,打開附加包含目錄編輯頁面,輸入兩個附加包含目錄,分別是「$(ProjectDir)src」和「$(ProjectDir)src\simgear\xml」,這樣編譯時工程就可以找到相應的頭文件了。
 

 

Step11.在工程屬性頁 -> C/C++ -> 代碼生成 –> 運行庫一欄,設置運行庫和靜態庫同樣的多線程 (/MT)。
Step12.在工程屬性頁 -> 連接器 -> 附加庫目錄一欄,添加一個附加庫目錄「$(ProjectDir)src」,接着在工程屬性頁->連接器->輸入->附加依賴項一欄添加一個附加依賴庫「JSBSim.lib」,這樣咱們就將以前編譯獲得的JSBSim.lib添加到咱們的工程中了。
Step13.編譯JSBSimLibTest工程,編譯成功以後咱們就獲得了一個JSBSimLibTest.exe可執行文件,這個文件應該是能夠實現和JSBSim.exe相同的功能的,能夠運行測試一下,測試成功就說明咱們編譯的靜態庫是可用的。
 

5.總結
這篇使用說明是參考《Building_JSBSim_with_Visual_Cpp_2010》寫的,目的是做爲簡要的參考,在編譯和執行JSBSim的過程當中也遇到的一些問題,在此進行簡要說明。

編譯平臺選擇x64和x86的區別
VS2015能夠選擇將應用程序編譯成x64位目標機程序和x86 32位應用程序,以前沒有嘗試過x64位應用程序的編譯,相比於32位應用程序,64位程序應該在性能上有所提高,可是32位程序一樣能夠在64位的機器上運行,相對來講兼容性更好一些,能夠按需選擇。

Debug/Release模式的區別
Debug模式相對於Release模式在編譯時減小了不少優化選項,這樣作犧牲了一部分的性能換來的調試的方便,在以前測試JSBSim.exe運行時,Release編譯獲得的應用程序運行明顯更快,顯然優化是頗有效果的。要發佈應用程序時仍是選Release好了。

運行時庫MT/MD
在以前的項目中就遇到過相關的問題,具體內容能夠自行百度,能夠參考《你所不知道的C和C++運行庫》,本文在編譯時選擇MT,主要是爲了減少應用程序對VS2015的依賴,能夠在其餘環境中獨立運行。

靜態庫添加到低版本工程中
以前幹過這樣的事,將VS2010編譯的靜態庫或者動態庫在VC6.0的工程中使用,仍是能夠用的。一樣將VS2015編譯的靜態庫給VS2010或者VC6.0應該也是能夠用的,能夠嘗試一下。

JSBSim的用處和使用方法面向對象的代碼是能夠複用的,咱們有了JSBSim.lib和相關的頭文件,那麼就能夠在本身的工程中複用相關的代碼了。不過JSBSim中的各個輪子還有待研究,若是之後有須要,就能夠利用其中的代碼實現本身的功能了。

相關文章
相關標籤/搜索