最近重新编译osg365,遇到了一些之前解决过现在又忘了怎么解决的问题,上网查资料整理后将编译全过程及遇到的问题记录在这里,方便下次再编译。
1 编译环境、代码、数据版本说明:
编译器:VS2017
操作系统:win10 x64
cmake:3.26.3
源码:OpenSceneGraph-OpenSceneGraph-3.6.5.zip
OSG三方依赖库:3rdParty_VS2017_v141_x64_V11_full.7z
数据包:OpenSceneGraph-Data-3.4.0.zip
源码、OSG三方依赖库、数据包官网均有下
2文件组织
为了编译的顺利进行,将下载的文件组织如下:
在D盘建立一个OSG的文件夹,然后将下载好的文件如下放置:
D:\OSG\OpenSceneGraph:源码解压后放于此
D:\OSG\3rdParty:第三方依赖库解压后放于此
D:\OSG\data:数据包解压后放于此
D:\OSG\OpenSceneGraph文件夹下新建build
文件组织时要注意解压时的目录层级
3设置多处理器编译
此操作目的是采用多处理器编译缩短编译时间,修改后我的DELL G15笔记本可以在1个小时内完成编译。老点的电脑两小时应该也能编完。有两种方法:
第一种方法:
打开D:\OSG\OpenSceneGraph文件夹下的CMakeLists文件,将
找到以下内容
OPTION(WIN32_USE_MP "Set to ON to build OpenSceneGraph with the /MP option (Visual Studio 2005 and above)." OFF)
将括号中的OFF改为ON,改后如下
OPTION(WIN32_USE_MP "Set to ON to build OpenSceneGraph with the /MP option (Visual Studio 2005 and above)." ON)
第二种方法,cmake中WIN32|WIN32_USE_MP勾选,如下图。
4 打开cmake,按下图设置路径,点击Configure
ACTUAL_3RDPARTY_DIR设置为D:\OSG\3rdparty
勾选以下选项:
BUILD_MFC_EXAMPLE
BUILD_OSG_APPLICATIONS
BUILD_OSG_EXAMPLES
BUILD_OSG_PACKAGES
CMAKE_INSTALL_PREFIX设置为D:\OSG\OpenSceneGraph\build
注意有的选项,要点击Configure一次或多次后才出现,直到点击Configure后没有红色部分后,单击Generate生成解决方案。
5 打开D:\OSG\OpenSceneGraph\build文件夹中的解决方案OpenSceneGraph.sln修改Examples osgviewerMFC项目
将项目中的stdafx.h中的WINVER和_WIN32_WINNT后面的数字改为0x0A00(来自项目|属性|C/c++|预处理器|预处理器定义中_WIN32_WINNT的值),否则会出现afxwin.h文件中很多符号找不到。更改后如下
#ifndef WINVER // Allow use of features specific to Windows XP or later.
#define WINVER 0x0A00 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0A00 // Change this to the appropriate value to target other versions of Windows.
#endif
6 生成
右键单击解决方案OpenSceneGraph,选批生成,选中ALL_BUILD中的debug和release两个生成,完成后再选择INSTALL中的debug和release两个生成(不要重新生成)。
7 关于MFC
如出现编译osgviewerMFC找不到afxwin.h,原因是VS安装时没装MFC导致,正确安装后不会出现此问题。
8 环境变量设置
OSG_FILE_PATH: D:\OSG\data
OSG_LIBRARY_PATH: D:\OSG\OpenSceneGraph\build\bin\osgPlugins-3.6.5
Path:增加D:\OSG\OpenSceneGraph\build\bin,D:\OSG\3rdParty\bin
设置完成后,可在命令提示符cmd中输入osgversion,显示如下
在命令提示符cmd中输入osglogo,显示如下
在命令提示符cmd中输入osgviewer cow.osg,显示如下
如以上显示都正确,说明编译配置正确。
9 新建工程
新建工程时选择空项目OsgX64DR
配置属性->C/C++->预处理器->预处理器定义添加”WIN32”
项目属性debug和release的vc++目录中的包含目录和库目录设置为C:\Program Files\OpenSceneGraph\include和C:\Program Files\OpenSceneGraph\lib(这两个路径与第4步cmake操作时“CMAKE_INSTALL_PREFIX”选项设置有关)
为项目增加源文件main.cpp,内容如下:
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#ifdef _DEBUG
#pragma comment(lib,"osgd.lib")
#pragma comment(lib,"osgDBd.lib")
#pragma comment(lib,"osgViewerd.lib")
#pragma comment(lib,"OpenThreadsd.lib")
#pragma comment(lib,"osgGAd.lib")
#pragma comment(lib,"osgUtild.lib")
#pragma comment(lib, "osgTextd.lib")
#pragma comment(lib, "osgWidgetd.lib")
#else
#pragma comment(lib,"osg.lib")
#pragma comment(lib,"osgDB.lib")
#pragma comment(lib,"osgViewer.lib")
#pragma comment(lib,"OpenThreads.lib")
#pragma comment(lib,"osgGA.lib")
#pragma comment(lib,"osgUtil.lib")
#pragma comment(lib, "osgText.lib")
#pragma comment(lib, "osgWidget.lib")
#endif
int main(int argc, char **argv)
{
osgViewer::Viewer viewer;
viewer.setSceneData(osgDB::readNodeFile("cow.osg"));
return viewer.run();
}
代码中的库,请根据需要增减。
编译运行后,显示为第8节中的牛。
10 将osgX64DR项目导出为项目模板,可方便后续新建工程使用。
11如果编译通过,运行时提示找不到“zlib.dll",或“zlibd.dll”可将
“3rdParty\bin”路径中的相应文件拷贝到
“C:\Windows\System32”路径
12权限问题
在win11下vs2017中直接用“本地Windows调试器”运行程序,会因为权限问题无法打开数据文件,此时退出vs,再重新以管理员身份运行vs即可。
本文参考了
OSG学习:WIN10系统下OSG+VS2017编译及运行_路人甲JIA的博客-CSDN博客
编译osgViewerMFC出现错误啦!_UltimateLove的博客-CSDN博客
https://www.cnblogs.com/xingzhensun/p/6272360.html
在此表示感谢!