【VC++开源代码栏目提醒】:网学会员--在 VC++开源代码编辑为广大网友搜集整理了:Win32编译OSG-2 x - 图形图像绩等信息,祝愿广大网友取得需要的信息,参考学习。
Win32环境编译OpenSceneGraph 2.x 王锐 从OpenSceneGraph 1.9.x开始OSG开始使用CMake工具来完成源
代码工程的生成工作而在以前的版本中OSG1.2及以下版本用于编译源
代码的
VC7和
VC8工程文件是直接附带的。
CMake是一个跨平台的编译工具可以自动测试操作平台的特性并使用简单的脚本语言来描述源
代码工程的生成要求并生成对应平台环境的工程文件makefile其作用类似于Linux下的autoconf。
相比以往的源
代码编译方式显然这种方式更加灵活用户也可以根据自己的需求自行添加删除组件。
在Windows环境下编译OSG 2.x所需的前期准备有 Visual StudioMinGW或者其他的C编程IDE平台。
CMake工具建议使用2.4.6及以上的版本下载地址 www.cmake.org OpenSceneGraph-2.x版源
代码稳定版本的下载地址为 www.openscenegraph.org/downloads/developer_releases/OpenSceneGraph-2.2.0.zip 最新开发版本的下载地址为 http://www.openscenegraph.org/downloads/developer_releases/OpenSceneGraph-2.3.4.zip 也可以下载SVN版本使用命令前提是安装了Subversion软件 svn co http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk OpenSceneGraph OSG的第三方开发库支持可以自行去各个
开源开发库的网站下载也可以从下面的地址下载整合好的开发库Lib文件和头文件 openscenegraph.org/downloads/dependencies/3rdParty_Win32binaries_2005_05_10.zip 为了实现对各种格式的模型和图像文件的加载OSG需要大量的第三方开发库支持这其中主要包括 FreeType库 提供了对ttfttccidcffceffonfnt格式的字体文件的加载支持。
用户程序使用osgdb_freetype.dll插件实现对上述字体的加载。
OSG 2.2及以下版本可以直接使用上面的整合下载地址下载FreeType 2.19的开发库文件。
OSG 2.3.x版本增加了Text3D类因此需要下载较新版本的FreeType 2.3.x www.freetype.org LibJPEG库 提供对jpgjpe格式的图片文件的加载支持用户程序使用osgdb_jpeg.dll实现加载。
可以直接下载整合的库文件。
LibPNG库 提供对png格式的图片文件的加载支持用户程序使用osgdb_png.dll实现加载。
可以直接下载整合的库文件。
LibTiff库 提供对tif格式的图片文件的加载支持用户程序使用osgdb_tiff.dll实现加载。
可以直接下载整合的库文件。
LibUnGIF库 提供对gif格式的图片文件的加载支持用户程序使用osgdb_gif.dll实现加载。
可以直接下载整合的库文件。
ZLib库 提供对zip格式的压缩文件的加载支持用户程序使用osgdb_zip.dll实现加载。
可以直接下载整合的库文件。
GLUT库 OpenGL应用工具包GUI库的一种。
可以与OSG嵌合。
可以直接下载整合的库文件。
GDAL库 GDAL是专用于解析地理信息数据GIS文件的工具库并遵循MIT/X许可证开放源
代码。
可以下载GDAL 1.4或以上版本www.gdal.org Collada库 COLLADA是免授权费用的开放标准技术使用基于XML的技术来描述3D内容其文件扩展名为dae。
用户程序使用osgdb_dae.dll实现加载。
需要下载相应的Collada-Dom库 www.collada.org Inventor库 Open Inventor是VRML文件的官方格式由SGI公司制定其规范并开发其文件扩展名为wrl。
用户程序使用osgdb_iv.dll实现加载。
需要相应的Open Inventor库可以查询SGI网站获取其最新信息 oss.sgi.com/projects/inventor Jasper库 Jasper由加拿大维多利亚大学的一位教师主持开发它支持“高压缩、低比特速率”的JPEG2000图片格式其文件扩展名为jp2。
用户
程序使用osgdb_jp2.dll实现加载。
需要下载相应的Jasper库 www.ece.uvic.ca/mdadams/jasperOpenVRML库 OpenVRML是一个可以为应用程序提供VRML支持的工具包其源
代码还在不断完善中。
文件扩展名为wrl用户程序使用osgdb_vrml.dll实现加载。
所需的版本为0.14.3更新的版本可能无法为OSG插件所用需要下载相应的OpenVRML库 www.openvrml.org Performer库 OpenGL Performer是一个可扩展的高性能实时三维视景开发
软件包有自己的数据格式类型其文件扩展名为pfb用户程序使用osgdb_pfb.dll实现加载。
需要相应的OpenGL Performer库可以
查询SGI网站获取其最新信息 oss.sgi.com/projects/performer/ QuickTime库 QuickTime SDK库提供了对MOV等媒体文件的强大支持它支持的文件扩展名包括movavimpgmpvdvmp4m4vpsdtgajpgjpejpegtiftiffgifpng等用户程序使用osgdb_qt.dll实现加载。
需要下载相应的QuickTime SDK库OSG 2.0需要QuickTime SDK 7.1.2及以上版本的支持。
可以登录Apple的网站并
注册然后下载 developer.apple.com/quicktime XINE库 XINE是一个Linux下的媒体播放开发库目前在Windows下尚无成熟的应用。
它支持的文件扩展名包括movmpgmpvdvaviwmv等。
Windows下可能无法编译。
FLTK库 一种轻量级的GUI库。
可以与OSG嵌合。
可以下载FLTK 1.1或以上版本www.fltk.org Qt库 最为强大的跨平台GUI库之一。
可以与OSG嵌合。
只能下载
开源版本Qt3/4的版本都是可以的 trolltech.com/products/qt Fox库 一款性能出色的GUI库。
可以与OSG嵌合。
可以下载FOX 1.6或以上版本www.fox-toolkit.org wxWidgets库 强大的跨平台GUI库之一其
代码特点可以下载2.8.x或以上版本 与MFC类似遵循LGPL协议。
可以与OSG嵌合。
www.wxwidgets.org SDL库 一款历史悠久的GUI库图形和声音的处理能力较强遵循LGPL协议。
可以与OSG嵌合。
可以下载1.2或以上版本 www.libsdl.org 准备好所需的源
代码编译工具和第三方开发工具后就可以开始在Windows环境下编译OSG 2.x了。
1、打开CMake的界面将OpenSceneGraph-2.x.zip解
压缩并将解压目录中的CMakeLists.txt文件拖动到CMake的界面下。
2、在弹出的对话框中选择与当前平台所对应的编程环境一般来说这是自动选择的用户也可以根据自己的需求生成其它编程环境下的Makefile或者工程文件。
3、按下Configure按钮此时列表框中出现一系列可以修改的参数值在完成所有的修改之前标识配置完成的“OK”按钮不会被启用因此也不会生成新的工程文件。
图中红色的选项说明该项需要立即进行配置灰色的选项说明该项已经配置完毕不过也可以重新进行配置。
按下“Configure”按钮进行本次配置而与当前所配置的项相关联的选项将在下一次配置时再次变红等待用户重新进行配置全部的选项都变成灰色后“OK”按钮可以被按下此时将生成用户所需的所有工程文件。
“Configure”按钮被按下多少次都没有关系系统会自动判断用户是否更改了选项参数并据此列出新的关联选项如果用户没有修改那么再次按下“Configure”后所有选项都呈现灰色直到用户修改其中某项的参数或者按下“OK”为止。
在第一次进行配置时有以下几项需要注意 ACTUAL_3DPARTY_DIR即整合的第三方开发库所在目录如果下载了OSG提供的整合好的第三方开发库那么可以在这里设置解压缩之后它的位置并直接按下Configure按钮。
CMake将在下次配置时自动
搜索所需的Lib文件和头文件路径。
CMAKE_CONFIGURATION_TYPES定义了工程文件中工程配置的种类缺省值包括DebugReleaseMinSizeRel和RelWithDebInfo四种类型。
注意不同的配置类型在工程中对应不同的编译选项可以在CMAKE_CXX_FLAGS和CMAKE_EXE_LINKER_FLAGS中进行修改。
CMAKE_INSTALL_PREFIX用于以后保存编译生成的EXEDLL和LIB文件的路径。
4、按下“Configure”进入第二次配置如图所示 可以看到FreeTypeLibUnGIF等第三方库的位置已经被正确找到在此后生成的工程文件中这些库文件的引用和参考目录将被自动添加。
此外还需要注意的是 BUILD_OSG_EXAMPLES是否编译OSG所有例子程序的选项应当选择“ON”。
BUILD_OSG_WRAPPERS是否编译OSG内省/反射库通常我们也可以设置为“ON”。
BUILD_MFC_EXAMPLE是否编译MFC与OSG嵌合的例子这一选项只有在选择编译OSG的例子程序并再次按下“Configure”之后才会出现。
通常我们选择“ON”。
此时如果再次按下“Configure”确认上述的修改那么“OK”按钮将可以使用按下“OK”按钮后即可生成所有的工程文件但是可能存在一些问题例如OSG的FreeType插件可能无法被正确地编译出来还有其他一些基于第三方开发库的插件如osgdb_qt等可能无法生成。
5、先不要急于按下“Configure”点击右上的选框“Show Advanced Values”可以看到
列表框中的选项增加了。
这其中很多选项是之前未经选择的。
这其中需要重新进行配置的主要是各个第三方开发库的头文件路径和Lib文件路径如果用户平台上还有其他GUI库例如QtFltkwxWidgets等那么也需要在这里重新进行配置。
配置第三方开发库的相关参数时主要需要配置以下两个参数的值 ……_INCLUDE_DIR头文件的位置。
……_LIBRARY需要链接的静态库文件。
……_LIBRARY_DEBUG相应的DEBUG库文件。
由于CMake并不能自动判断所有的第三方链接库的配置情况因此更多时候用户需要自己动手进行这两项的配置配置的具体方法如下表其中略去了绝对路径且使用头文件的名称来表示INCLUDE_DIR事实上应当用绝对路径的目录名。
例如ft2build.h则INCLUDE_DIR应当为这个头文件所在的那一级子目录FL/Fl.h则INCLUDE_DIR应当为FL目录的上一级子目录。
下表是笔者编译OSG 2.2及OSG 2.3.x时使用的Cmake配置参数由于所使用的第三方依赖库的差异不同的人在编译时可能会有所差异请根据实际情况自行调整。
COLLADA COLLADA_INCLUDE_DIRdae.h COLLADA_LIBRARYlibcollada141dom13.lib FLTK FLTK_INCLUDE_DIRFl/Fl.h FLTK_LIBRARYfltk.lib FLTK_GL_LIBRARYfltkgl.lib FOX FOX_INCLUDE_DIRfx.h FOX_LIBRARYFOX-1.6.lib FREETYPE FREETYPE_INCLUDE_DIR_ft2buildft2build.h FREETYPE_INCLUDE_DIR_freetype2freetype/config/ftheader.h FREETYPE_LIBRARYfreetype235.lib GDAL GDAL_INCLUDE_DIRgdal.h GDAL_LIBRARYgdal_i.lib GIFLIB GIFLIB_INCLUDE_DIRgif_lib.h GIFLIB_ LIBRARYlibungif.lib GLUT GLUT_INCLUDE_DIRGL/glut.h GLUT_LIBRARYglut32.lib GLUT_glut_LIBRARYglut.lib INVENTOR INVENTOR_INCLUDE_DIRInventor/So.h INVENTOR_LIBRARYINV600.LIB JASPER JASPER_INCLUDE_DIRjasper/jasper.h JASPER_LIBRARYjasper.lib JPEG JPEG_INCLUDE_DIRjpeglib.h JPEG_LIBRARYlibjpeg.lib OPENVRML OPENVRML_INCLUDE_DIRopenvrml/common.h OPENVRML_LIBRARYopenvrml.lib PERFORMER PERFORMER_INCLUDE_DIRPerformer/pfdu.h PERFORMER_LIBRARYlibpf.lib PNG PNG_INCLUDE_DIRpng.h PNG_PNG_INCLUDE_DIRpng.h PNG_LIBRARYlibpng.lib QT QT_……_INCLUDE_DIRQT的头文件目录 QT_……_LIBRARY……所指的LIB文件所在位置 QT_……_EXECUTABLE……所指的EXE文件所在位置 QUICKTIME QUICKTIME_INCLUDE_DIRQuickTime.h QUICKTIME_LIBRARYqtmlClient.lib SDL SDL_INCLUDE_DIRSDL.h SDLMAIN_LIBRARYsdlmain.lib SDL_LIBRARY_TEMPsdl.lib TIFF TIFF_INCLUDE_DIRtiff.h TIFF_LIBRARYlibtiff.lib XINE 在Windows下可能无法编译 ZLIB ZLIB_INCLUDE_DIRzlib.h ZLIB_LIBRARYzlib.lib wxWidgets wxWidgets_ROOT_DIRwxWidget的安装目录 wxWidgets_LIB_DIRwxWidgets的LIB文件所在目录 6、确认所有的配置选项都变成灰色后按下“OK”。
对于
VC7
VC8系列此时将生成新的解决
方案文件OpenSceneGraph.sln。
打开.sln工程文件选择“批生成”并选择编译生成ALL_BUILD即整个OpenSceneGraph工程。
对于
VC6CMake也可以生成相应的dsw工程文件但是编译时要注意标准C STL模板与
VC6模板的冲突问题可能需要选择安装STLPort支持而且OSG官方已经不再提供针对
VC6的技术支持。
对于
VC8可能存在源
代码中某些字符无法被识别的问题此时该字符将显示为“”而直接在
VC中进行编译将无法通过需要手动将源
代码中未被识别的字符改回原样。
osgversion工程和QuickTime SDK的头文件中可能会出现此错误将“”改为下引号即可 7、一些需要第三方支持的插件编译过程中难免会出现编译错误或者“LNK2019”的错误这是由于
VC的编译器不规范或者某些必要的链接库没有被引用所致此时可以注意观察错误的详细提示信息修改
代码或添加必要的Lib库。
链接时也可能出现函数冲突的错误根据需要设置“/NODEFAULTLIB:xxx.lib”即可。
下面列出一些笔者编译时遇到的错误 FLTK 编译通过链接时出现LNK2019的错误。
工程的链接库一栏中缺少comctl32.lib和wsock32.lib添加即可。
Jasper 编译通过链接时出现库的冲突。
选择忽略库libcmt.lib。
Inventor 编译不通过出现类型未定义的错误。
部分类型在Win32环境中没有定义。
在出错的文件中添加红色的行 include ...... typedef signed char int8_t typedef short int16_t typedef unsigned short uint16_t OpenVRML OpenVRML本身无法正确编译。
下载0.14.3的地址 sourceforge.net/project/downloading.phpgroupnameartoolkitfilenameOpenVRML-0.14.3-win32.zip 此外需要对OpenVRML的部分源文件进行修改主要是旧有的C函数格式与C标准的冲突问题简单进行修改后即可编译通过。
wxWidgets 出现与wxGLCanvas相关的LNK2019错误。
这不是编译时OSG的
问题而是我们所使用的wxWidgets没有开启OpenGL功能项。
重新设置lib目录下setup.h文件中wxUSE_GLCANVAS参数为1并再次编译wxWidgets。
Qt 出现QmultiMap字样这一问题只出现在使用VS8 SP1的用户中这是的编译错误。
VS编译器的一个新问题需要修改Qt的qmap.h源
代码 添加红色的行 template class QMultiMap : public QMap public: typedef typename QMap::iterator QMapIteratorType … 然后修改两处第二处的函数为insert而非replace Q_INLINE_TEMPLATE Q_TYPENAME QMap::iterator QMultiMap::replaceconst Key akey const T avalue 为 Q_INLINE_TEMPLATE Q_TYPENAME QMultiMap::QMapIteratorType QMultiMap::replaceconst Key akey const T avalue Wrapper osgSim 出现LNK2019错误且全部与目标文件OpenFlightSimulator.obj相关。
从OSG 2.2升级到OSG SVN版本时这个问题困扰了笔者很久但是其实原因很简单 OSG 2.3.x中去除了osgSim:: OpenFlightSimulator类以及相应的文件但是OSG 2.2中该文件还存在因此直接使用SVN版本覆盖源文件时不会覆盖该文件造成工程链接时无法识别该文件的信息。
删除源文件即可。
8、所有的库文件插件和示例程序都编译生成之后就可以将它们安装到之前通过CMAKE_INSTALL_PREFIX参数指定的路径中了。
打开“批生成”界面并选择生成INSTALL工程。
可以看到
系统正在执行文件的安装
工作 在这个路径下会自动建立binlibinclude和share目录以便区分存放DLLLIB头文件和可执行的示例程序。
最后我们可以设定
常用的系统环境变量并开始我们的OpenSCeneGraph之旅了。