WIN10+VS2017+OSG3.6.5
该编译方法适用于vs2017和vs2019
一、环境准备
1、配置环境
vs2017
cmake 3.26.0
安装cmake参考: https://blog.csdn.net/u011231598/article/details/80338941
2、OSG相关准备
源码:OpenSceneGraph-OpenSceneGraph-3.6.5
依赖:3rdParty_VS2017_v141_x64_V11_full
数据:OpenSceneGraph-Data-3.4.0
osg官网地址: https://www.openscenegraph.com/index.php/download-section
源码我选择了官网的最新版本,大多数教程选择的3.4.1
依赖:必须选择vs2017对应版本
数据:我选择了3.4.0
二、使用cmake进行构建
1、文件目录
将数据解压放到D盘中,文件目录如下:(文件夹名字我做了修改)
其中3rdParty做如下修改:将x64文件夹中的内容往前提一级
2、使用cmake进行构建
2.1 准备
打开cmake-gui
将OpenSceneGraph中的cmakelists.txt拖入到cmkae中
修改路径开始构建
Finish完成后会出现红色的提示。
2.2 (可跳过)移除nvtt相关模块
这一步可以先跳过,如果之后的批运行(第三章)nvtt报错的话可以执行这一步!
破案了,我试了3.6.5和3.4.1 2个版本,发现3.4.1会报这个错,更换3.6.5是可以正常使用的
下面的解决方法暂时不删了,算是一个解决思路吧,目前仍然解决不了3.4.1中nvtt的问题。以后有时间解决了再来改回答
在之后的批生成过程中,我的nvtt相关模块始终报错,而且找不到解决方案,
一个大佬说nvtt已经没有必要再用了,直接修改cmkae中的相关内容
报错内容大概如下:
------ 已启动生成: 项目: Plugins nvtt, 配置: Release x64 ------
1>Building Custom Rule E:/OSG/OpenSceneGraph/src/osgPlugins/nvtt/CMakeLists.txt
NVTTImageProcessor.cpp
nvtt.lib(CompressionOptions.obj) : 找到 MSIL .netmodule 或使用 /GL 编译的模块;正在使用 /LTCG 重新启动链接;将 /LTCG 添加到链接命令行以改进链接器性能
nvtt.lib(CompressionOptions.obj) : error LNK2001: 无法解析的外部符号 "int __cdecl nvAbort(char const *,char const *,int,char const *,char const *,...)" (?nvAbort@@YAHPEBD0H00ZZ)
nvtt.lib(CompressionOptions.obj) : error LNK2001: 无法解析的外部符号 "unsigned int __cdecl nv::findD3D9Format(unsigned int,unsigned int,unsigned int,unsigned int,unsigned int)" (?findD3D9Format@nv@@YAIIIIII@Z)
nvtt.lib(CompressionOptions.obj) : error LNK2001: 无法解析的外部符号 "private: void __cdecl nv::String::setString(char const *)" (?setString@String@nv@@AEAAXPEBD@Z)
我的修改方法如下,找到nvtt,然后都设置为remove。
2.3 第二次Configure
第一次Configure会出现红色的提示,做如下修改:
ACTUAL_3RDPARTY_DIR 修改路径
BUILD_OSG_EXAMPLES 打勾
CMAKE_INSTALL_PREFIX 修改路径
2.4 第三次Configure
第二次configure完成后,还有红色提示,操作如下:
对最上面的 BUILD_MFC_EXAMPLE 那个打勾,然后继续configure
2.5 生成
红色全部消失!
generate完成。
这次可以打开vs开始编译生成了。
两种打开方式:
点击Open Project
或者
D:\OSG\OpenSceneGraph\build中打开OpenSceneGraph.sln
三、使用vs2017开始批生成
1 、批生成
这一步时间很久,4小时左右。
2、对报错进行修改(没有报错跳过这步!)
我主要遇到3种错误
2.1 nvtt报错
这一步看第二章的2.2
2.2 无法打开包括文件: “afxwin.h”
------ 已启动生成: 项目: Examples osgviewerMFC, 配置: Release x64 ------
1>Building Custom Rule E:/OSG/OpenSceneGraph/examples/osgviewerMFC/CMakeLists.txt
MFC_OSG_MDI.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
MFC_OSG_MDIDoc.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
MFC_OSG_MDIView.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
stdafx.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
MFC_OSG.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
MainFrm.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
ChildFrm.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
正在生成代码...
已完成生成项目“example_osgviewerMFC.vcxproj”的操作 - 失败。
------ 已启动生成: 项目: Examples osgviewerMFC, 配置: Debug x64 ------
------ 已启动生成: 项目: Examples osgviewerMFC, 配置: Debug x64 ------
1>Building Custom Rule E:/OSG/OpenSceneGraph/examples/osgviewerMFC/CMakeLists.txt
MFC_OSG_MDI.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
MFC_OSG_MDIDoc.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
MFC_OSG_MDIView.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
stdafx.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
MFC_OSG.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
MainFrm.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
ChildFrm.cpp
e:\osg\openscenegraph\examples\osgviewermfc\stdafx.h(38): fatal error C1083: 无法打开包括文件: “afxwin.h”: No such file or directory
正在生成代码...
已完成生成项目“example_osgviewerMFC.vcxproj”的操作 - 失败。
------ 已启动生成: 项目: Examples osgvirtualprogram, 配置: Release x64 ------
解决办法:vs缺少MFC组件
如果使用的是vs2019,工具包名字不同,但是关键字是MFC X86 X64就可以哦!
参考: https://blog.csdn.net/bailang_zhizun/article/details/120992244
2.3 “example_osgviewerMFC.vcxproj”的操作 - 失败。
报错内容大致如下:
------ 已启动生成: 项目: Examples osgviewerMFC, 配置: Release x64 ------
MFC_OSG_MDI.cpp
D:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include\atlwinverapi.h(710): error C3861: “LCMapStringEx”: 找不到标识符
D:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include\afxwin.h(2108): error C3646: “m_pConfigs”: 未知重写说明符
D:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include\afxwin.h(2108): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
D:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include\afxwin.h(2029): error C2065: “GC_PAN_WITH_GUTTER”: 未声明的标识符
正在生成代码...
已完成生成项目“example_osgviewerMFC.vcxproj”的操作 - 失败。
------ 已启动生成: 项目: Examples osgviewerMFC, 配置: Debug x64 ------
MFC_OSG_MDI.cpp
D:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include\atlwinverapi.h(710): error C3861: “LCMapStringEx”: 找不到标识符
D:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include\afxwin.h(2108): error C3646: “m_pConfigs”: 未知重写说明符
D:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include\afxwin.h(2108): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
D:\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\atlmfc\include\afxwin.h(3048): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
正在生成代码...
已完成生成项目“example_osgviewerMFC.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 2 个,最新 552 个,跳过 0 个 ==========
注:错误信息只截取了部分
解决:
两处:
0501 改为 0A00
再次运行:
参考: https://blog.csdn.net/bailang_zhizun/article/details/120992244
3、install
批生成没有问题后就可以安装了
四、添加环境变量
0、打开环境变量
打开此电脑,右键点击属性,进入高级设置,进入环境变量
1、追加path的环境变量
系统变量里,找到path,添加3个环境变量,分别为:
D:\OSG\OpenSceneGraph\bin
D:\OSG\OpenSceneGraph\build\bin
D:\OSG\3rdParty\bin
2、添加环境变量:
在用户环境变量中,添加:
变量名:OSG_FILE_PATH
变量值:D:\OSG\OpenSceneGraph-Data
五、测试
1、命令行测试
打开cmd命令行:
输入
- osgversion
- osglogo
- osgviewer cow.osg
2、代码测试
新建一个c++控制台项目。
打开项目属性
2.1 更改配置
顶部配置改为: Debug x64
2.2 包含目录
VC++目录—>包含目录:D:\OSG\OpenSceneGraph\include
2.3 库目录
VC++目录—>库目录:D:\OSG\OpenSceneGraph\lib
2.4预处理器
C/C+±----->预处理器 ---->预处理器定义 ----->添加:WIN32
2.5 附加依赖项
连接器 ----->输入 ----->附加依赖项:
OpenThreadsd.lib
osgd.lib
osgDBd.lib
osgUtild.lib
osgGAd.lib
osgViewerd.lib
osgTextd.lib
2.5 修改x64
我这里顶部默认是x86,include引用会报红,需要改为x64
2.6 添加代码
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
int main(int argc, char **argv)
{
osgViewer::Viewer viewer;
viewer.setSceneData(osgDB::readNodeFile("cow.osg"));
return viewer.run();
}
2.7 测试运行
ctrl+F5
参考: https://blog.csdn.net/u013719339/article/details/78415685
参考: https://blog.csdn.net/fx_odyssey/article/details/117848102
补充:有的代码需要加头文件
#include “stdafx.h”
但是我这里会报红。
一种解决办法是用以下两个头文件来代替:
#include <stdio.h>
#include <tchar.h>