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):

FlightGear编译小结_第1张图片

就只有4个项目。右击FlightGear查看其属性->C/C++->常规,有一个附加包含目录:

FlightGear编译小结_第2张图片 看看这些值,就知道应该把依赖库的包含文件放在哪里。当然我们也可以改变这些值,然后再把包含文件放在相应改变后的位置,只要编译时找得到就OK。同时还有链接时的依赖库的lib文件的位置(属性->链接器->常规):

FlightGear编译小结_第3张图片这样在出现问题时就不会担心是不是因为把相关文件放错位置了。

真正开始编译时,所谓的顺序其实就是先把相关包含文件和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的朋友们一点帮助。如有疑惑,欢迎交流,倘有错误之外,恳请指正。

胡靖飞

你可能感兴趣的:(Experience)