当前位置: 首页 > 工具软件 > jsbsim > 使用案例 >

[转][JSBSim]使用VS2015编译JSBSim

杨星纬
2023-12-01

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

请大家去看原文,原文有图片和资源,本文仅供本人参考

权威参考: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进行编译。

 

根据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中的各个轮子还有待研究,如果以后有需要,就可以利用其中的代码实现自己的功能了。

转载于:https://www.cnblogs.com/lyggqm/p/9986509.html

 类似资料: