osg(osg中文社区)-osgEarth-osgViewer-基于OpenGL-开源三维渲染引擎-图形引擎-虚拟仿真工具-osg教程-osg仿真

使用VS进行编译

当前位置:首页 > 学习支持 > 平台介绍 > Windows


写在前面:一切库都是由include,lib,bin组成,include中是头文件,lib中是链接文件,这两个是编译时候使用的,bin中是DLL文件这是运行时使用的,如果是静态链接库则没有DLL。因此OSG编译完成后也有这三个部分,OSG在使用CMAKE进行配置的时候,需要的第三方库也必有这三个部分,因为CMAKE是编译配置,所以只会让你配置include和lib,bin则运行时找到就可以了(往往会加到path中)。任何一本OSG的教程几乎都会提到如何编译,推荐大家要从理解的角度,要看每一步为什么,因为情况太多,不能所有的情况都写上,就太繁琐了。

本文用于从源码直接对OSG进行编译的用户,也可以直接下载二进制文件而省即编译的痛苦,对于初学者来说编译开源库都是件难事,有些库就连高手对之编译也忘而却步,但是OSG的编译还好,很常规,建议每个人从头编译。可以在下载版块找到下载源码和已经编好的二进制以及第三方库的方法。

也可以参考下面两篇老掉牙的相关文档:

VS插件
VS6.0编译


使用VS进行编译

(注意: 本文使用VS2005进行测试,应该同样适用于VS2003以上的其它版本)


初始配置 

因为CMAKE会自动的在同级目录下搜索第三方库,所以建议你的目录结构按如下设置:

OpenSceneGraph-VERSION (将VERSION替换为你的OSG版本号,比如3.0.0) 
OpenSceneGraph-VERSION3rdParty (第三方库,是必须的) 
OpenSceneGraph-VERSIONOpenSceneGraph

在OpenSceneGraph文件夹中直接放置的是源码,注意是直接放置源码(第一个有CMakeLists.txt夹),不要外面还建了好几级文件夹。源码可以在下载版块找到相边下载方式。同样3rdParty中存放的第三方库也在第三方库版块中可以找到。


使用CMAKE生成VC工程

在此处下载CMAKE http://www.cmake.org/HTML/Download.html.

打开CMAKE GUI程序,在 "Where is the source code"中选择OpenSceneGraph文件夹,因为里面有顶层的CmakeList.txt,是源码的顶层目录,如果里面没有CmakeList.txt就要看看是不是源码外又建了几级没用的文件夹。在"Where to build the binaries" 中选择一个目录来生成VC工程,一般这个目录和源码目录都离的不远,甚至有人把其选成同一个目录,根据各人习惯吧,如果选在同一级会生成大量的文件与源码掺在一起,很难看。点击config。

首先将ACTUAL_3RDPARTY_DIR设置到你的3rdparty文件夹中,如果按上面的说明在源码的上一级文件夹中,会自动找到,这样很库就会自动搜索到,然后点config注意那些红的项,表示是必选的和因为某些项的选择新出现的,将BUILD_OSG_EXAMPLES 置为ON,这样工程中才包含例子的工程。将CMAKE_INSTALL_PREFIX设置到OpenSceneGraph目录,则二进制文件会被自动安装到OpenSceneGraphin,当然你也可以设置在别处,也可以不设置默认。

接着就是配置第三方的依赖了,比如PNG, TIFF,FreeType等,看写在最前面的话,它要求的都是include和lib,不会有别的。如果你需要其它的第三方库,找到它的include和lib就可以了,这里的配置是会在VS工程的配置里影响,如果配置错了可以使用CMAKE重新生成,也可以直接改VS工程。点击config,看看是否有些必须的东西要配置而没有配置的,也可以点击advance选项,以高级方式查看是否有些项你感兴趣但是没有配置的。

如果觉得所有的你都配置好了,那么就直接生成工程,如果后悔了,可以再配置,再生成,会将之前的工程冲掉。


构建

打开 OpenSceneGraph.sln,其在CMAKE中选择的"Where to build the binaries" 目录(比如. OpenSceneGraphuild), 然后点击Build,Batch Build只需要把Debug/Release的ALL_BUILD选项打勾即可,其它的比如MinSizeRel等可以根据你的需求打勾,注意除ALL_BUILD之外的其它的不用打勾,点击Build即可,会需要较长的时间。 假设所有的都OK,可以右键单击INSTALL工程,然后构建它, 它会将编译结果拷到CMAKE_INSTALL_PREFIX指定的地方,如果这个构建出现了问题,需要手工拷,步骤如下,找个干净的地方,建个OSG目录,里面有include, lib, bin三个文件夹,把bin添到path中。把源码的include和"Where to build the binaries"合并到OSG/include中,注意有重复的要用"Where to build the binaries"去覆盖源码include里的。然后把"Where to build the binaries"其下的lib目录东西拷到OSG/lib中,把所有的bin里的东西移到OSG/bin,这样OSG就算构建完毕了,我们就是为了include, lib, 和bin的。当然你也可以把这三者给堆到源码目录或者构建目录或者这三者都在一起,只要理解了,都不是问题了。

下面介绍OSG涉及的常见的环境变量


注意:

COMPILATION TIME

第一次编译会消耗较长的时间,一旦第一次编译完成,后面就是增量编译,就好很多。也可以使用并行编译,自己找软件吧,给你们说个incredibuild。

Environment variables

OSG_ROOT 指向包含include/lib/bin的目录。
OSG_BIN_PATH = %OSG_ROOT%in
OSG_INCLUDE_PATH = %OSG_ROOT%include
OSG_LIB_PATH = %OSG_ROOT%lib
OSG_SAMPLES_PATH = %OSG_ROOT%shareOpenSceneGraphin
OSG_FILE_PATH = ???OpenSceneGraph-Data-X.X

添加 %OSG_BIN_PATH% 和%OSG_SAMPLES_PATH% 到 PATH 中。新起一个命令行,输出osgviewer cow.osg看一下。根据错误提示来判断。

在程序中若要使用OSG,需要进行如下配置,每个VS的配置都不同,但是都相似:

Properties - C/C++ - General - Additional Include Directories = $(OSG_INCLUDE_PATH)
Properties - C/C++ - Preprocessor - Preprocessor Definitions = WIN32;_WIN32;NDEBUG
Properties - Linker - General - Additional Library Directories = $(OSG_LIB_PATH)
Properties - Linker - Input - Additional Dependencies = (any OSG library your project needs - for example: osg.lib osgGA.lib osgDB.lib osgViewer.lib osgText.lib osgUtil.lib OpenThreads.lib)

也可以在程序中使用#pragma comment宏,使用_DEBUG来区分DEBUG和RELEASE来定义,但是那只限VS,在Linux上是不支持的。


关于插件

每一个编译好的OSG都会在lib和bin里生成插件目录为osgPlugins-3.1.6,插件的名字一般为osgdb_***.lib或dll之类的,插件是使用固定接口来做事情的机制,比如读取ive文件,会自动找到其下的osgdb_ive.dll其代码就是VS工程里的插件里的ive的工程。值得一提的是若需要调试则需要在bin目录中有*.pdb文件,因为里面包含了调试信息,在调试时找不到源码会提示你重新选择源码位置。再回到插件,当你需要读一个文件时,比如OSG系统初始化会读一个字体文件,那么如果你没有编译FreeType库,就会在osgviewer cow.osg时提示找不到插件来读什么什么tff文件之类的,此时观察提示文件的扩展名,到插件目录中看有没有osgdb_***.dll,***就是提示的你没有插件,然后在CMAKE中配置上重新编译整理就可以了。

插件机制是极为重要的,建议大家详细调试解读一下,OSG和OSG的相关扩展很多的设计都借用的插件机制,而不是仅仅是读写模型用的。