OSG源码编译

本文是基于VS2013+OpenSceneGraph3.6.0进行编译。

1. 安装包和工具准备:

如果需要生成帮助文档,则需要多下载两个软件: 

说明:

(1) OSG源码:OpenSceneGraph-3.6.0,这里使用的是官网稳定版本3.6.0

(2) 第三方依赖库:3rdParty,这里使用的是VS2013_x64版本,选择和VS对应版本即可

(3) CMAKE:cmake-3.15.6,这里使用的是3.15.6版本

(4) OSG数据:OpenSceneGraph-Data,这里使用的是3.4.0版本

(5) doxygen:用于生成CHM格式的帮助文档

(6) graphviz:图像可视化软件,用于生成类与类之间的关系图

 

2. CMake配置和生成.sln:

  • 设定源路径和构建路径,其中源路径选择OSG源码路径,构建路径放在源码路径新建的Build文件夹下(名字可自己定义),如图所示:

 

  • 选择之后,勾选Advanced,配置构建项。需要设置的地方如下,其余可根据自己需要进行设置:

ACTUAL_3RDPARTY_DIR:第三方依赖库的位置,默认的一般是错误的,填写3rdParty所在的路径

BUILD_DOCUMENTATION:是否构建相关文档,可勾选上

BUILD_MFC_EXAMPLE:是否构建osg的MFC实例代码,可根据自己需要勾选

BUILD_OSG_APPLICATION:是否编译OSG的可执行文件,里面包含了osgarchive,osgconv,osgversion,osgviewer

BUILD_OSG_EXAMPLE:是否编译OSG的默认例子,建议勾选,对前期学习很大帮助

BUILD_OSG_PLUGINS:是否编译OSG插件,勾选上

CMAKE_INCLUDE_PATH:包含文件目录,可以不指定,编译完成后复制

CMAKE_INSTALL_PREFIX:cmake安装目录,这里选择了源码目录下,即C:/OSG/OpenSceneGraph-OpenSceneGraph-3.6

CMAKE_LIBRARY_PATH:库文件目录,可以不指定,编译完成后复制

DXYOGEN_DOT_EXECUTABLE:用于生成帮助文档的osg的类的关系图,目录设定为Graphviz目录下dot.exe的位置,如:D:/Program Files (x86)/Graphviz2.38/bin/dot.exe

DXYOGEN_EXECUTABLE:用于生成CHM帮助文档,目录设置为dxyogen目录下doxygen.exe的位置,如:D:/Program Files/doxygen/bin/doxygen.exe

其余配置按默认选项即可

  • 配置完后点击Configure,如果有问题则修改报错的配置
  • 点击Generate生成,等待完成

OSG源码编译_第1张图片

3.  打开VS2013,打开构建好的sln项目文件(CMake的输出路径)下,点击生成-批生成,勾选ALL_BUILD的Debug和Release版本,点击确定。整个过程持续4-5小时(6年前的小破本编译的)

OSG源码编译_第2张图片

4. 如果编译失败,则检查原因,这里列举我遇到的两个问题:

(1)缺少unistd.h文件

  • 编译完成之后报了很多无法打开../../../osgdb.lib的错误信息,选择其中一个项目进行重新编译,发现是缺少了unistd.h文件,导致所有链接库都生成失败。
  • 在Linux下开发的程序都会有unistd.h这个文件,作用类似于windows下的windows.h的头文件,而VC没有这个文件,这时候只需要在第三方依赖库所在的目录下的include文件夹下,手动添加进去即可。unistd.h的内容如下:
#ifndef _UNISTD_H

#define _UNISTD_H
#include 
#include 

#endif /* _UNISTD_H */

(2)osgviewerMFC编译不成功

  • 如果在cmake阶段勾选了OSG_MFC_EXAMPLE,就会报出一堆宏定义未定义的问题。

OSG源码编译_第3张图片 

  • 经过检查发现,这些宏定义都在WinUser.h中有声明,但是在WINVER>=0x0601才会生效(即Windows Server 2008 R2系统以上才生效),而osgviewerMFC的WINVER版本是0x0501(stdafx.h),属于XP系统版本,所以是由于版本不兼容导致的问题
#ifndef WINVER             
#define WINVER 0x0501 
#endif
#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0501
#endif
  •  检查osgviewerMFC的预编译定义(项目-属性-C/C++-预编译定义)中,发现该项目是定义为0x0A00(Win10)

 OSG源码编译_第4张图片

  •  这时候我们只需要把WINVER修改为0x0A00即可,保证版本统一
	#ifndef WINVER             
	#define WINVER 0x0A00   // 修改此处
	#endif
	#ifndef _WIN32_WINDOWS     
	#define _WIN32_WINDOWS 0x0A00  // 修改此处
	#endif
  • 附上:Window各个版本对应的宏值

Minimum system required

Macros to define

Win8

_WIN32_WINNT>=0x0602 

WINVER>=0x0602

Win7

_WIN32_WINNT>=0x0601 

WINVER>=0x0601

Windows Server 2008 R2

_WIN32_WINNT>=0x0601 

WINVER>=0x0601

Windows Server 2008

_WIN32_WINNT>=0x0600 

WINVER>=0x0600

Windows Vista

_WIN32_WINNT>=0x0600 

WINVER>=0x0600

Windows Server 2003

_WIN32_WINNT>=0x0502 

WINVER>=0x0502

Windows XP

_WIN32_WINNT>=0x0501 

WINVER>=0x0501

Windows 2000

_WIN32_WINNT>=0x0500 

WINVER>=0x0500

Windows NT 4.0

_WIN32_WINNT>=0x0400 

WINVER>=0x0400

Windows Me

_WIN32_WINDOWS=0x0500 

WINVER>=0x0500

Windows 98

_WIN32_WINDOWS>=0x0410 

WINVER>=0x0410

Windows 95

_WIN32_WINDOWS>=0x0400 

WINVER>=0x0400

  • 然后又报新的错误:

OSG源码编译_第5张图片

第一个问题是因为附加依赖项加了个莫名其妙的路径,可能是在各种折磨的时候加进去的,删除即可解决

OSG源码编译_第6张图片

第二个问题是因为缺少了mfc120.lib的文件,在osgviewerMFC项目中添加库目录即可(项目-属性-VC++目录-库目录)

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\lib\amd64;

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\lib\;

OSG源码编译_第7张图片

如果以上目录下没有这两个文件,则安装Multibyte MFC Library for Visual Studio 2013。

解决以后再次批生成,完美解决。

 

5. 再次选择批生成,这次勾选INSTALL

6. 生成目录合并

将构建目录Build下的bin,include和lib拷贝到osg源码下对应的位置,也可以把两个目录下的bin,include和lib都拷贝到单独的文件夹里面。

7. 配置环境变量:

  • 将bin目录所在的路径添加到PATH环境变量中:

  • 新建系统变量,变量名为:OSG_FILE_PATH,变量值为osg数据所在路径

OSG源码编译_第8张图片

  • 在命令行(CMD)中输入命令 osgversion,osglogo,osgviewer cow.osg进行测试,如果成功表示环境配置成功,如果提示缺少zlib.dll,则需要在第三方依赖库3rdParty中把相应的文件拷贝到bin目录下

 

8. 编写第一个osg程序

  • 新建一个win32控制台程序:

OSG源码编译_第9张图片

  • 添加包含目录:配置属性-VC++目录-包含目录,即最后拷贝好的include目录

OSG源码编译_第10张图片

  • 添加库目录:配置属性-VC++目录-库目录,即最后拷贝好的lib目录

OSG源码编译_第11张图片

  • 添加依赖库:配置属性-链接器-附加依赖项,输入以下链接库(其中带d为Debug版本,要一一对应)

OSG源码编译_第12张图片

  • 编写简单的测试代码进行测试,如果成功表示配置环境成功:

	#include "stdafx.h"
	#include 
	#include 
	int _tmain(int argc, _TCHAR* argv[])
	{
	  osgViewer::Viewer viewer;
	  viewer.setSceneData(osgDB::readNodeFile("glider.osg"));
	  viewer.realize();
	  viewer.run();
	  return 0;
	}

 

如果出现外部符号无法解析,原因可能是:

(1)开发平台不是64位的

(2)依赖项未添加

(3)包含头文件未添加

(4)库目录未添加

所有操作都可以在工程项目中,右键属性中完成

你可能感兴趣的:(osg)