总的来说,Qt是可以编译osg和osgEarth的。
本人从小白开始,历经1个半月,学习开源和编译。OSG3.4 ,CMake3.10.1 ,osgEarth2.9 ,Qt5.3.0,这样编译,但是在运行osgEarth例子的时候回出现libstdc++-6.dll的提示。这个是时候要用到Qt5.7/Tools/mingw/bin下的libstdc++-6.dll了,这个技巧是我编译了好多天,偶尔发现的,个人任务是osgEarth和Qt版本不匹配的问题。还有缺少libiconv-2.dll,请从Qt5.3里搜索libiconv,然后找到libiconv2.dll.,拷贝到编译的dll下,改个名字中间加个"-"。于是,我可以尝试用Qt5.7编译,或许可以省去很多麻烦。需要特别强调的是,C:\Qt\Qt5.3.0\5.3\mingw482_32\bin下的mingw-make是可以编译osg的,就是Cmake的时候选择mingw-makefile编译器,并指定C:\Qt\Qt5.3.0\5.3\mingw482_32\bin\gcc.exe和C:\Qt\Qt5.3.0\5.3\mingw482_32\bin\g++.exe
心得:最好编译gdal .jpeg,curl是用mingw-get的mingw shell生成.a和文件和.dll文件。完了之后清理下系统环境变量,保证只有C:\Qt\Qt5.3.0\5.3\mingw482_32\bin,这样在用CMake配置 osg的时候configure出来属性参数里不会出现类似C:\mingw\bin路径,现在选择性的可以去掉freetype这样的字体库。注意勾选OSG_USE_QT ,另外
本文总结了再windows 32位机子下实现在Qt5.3.0中使用openscenegraph( osg) 和osgearth
准备工作:C:\Qt\Qt5.3.0\5.3\mingw482_32\bin
1.下载Qt:qt-opensource-windows-x86-mingw482_opengl-5.3.0.exe, 没有vs,
下载网址:http://www.qtcn.org/bbs/read-htm-tid-1075.html 或者百度Qt官网。
(1)安装好了之后,将下面两个路径设置到系统环境变量里,后面CMake时会自动查找。
C:\Qt\Qt5.3.0\5.3\mingw482_32\bin;和 C:\Qt\Qt5.3.0\Tools\mingw482_32\bin;
2.下载mingw,参考我写上一篇文章,再复制一下它的下载地址:
https://ncu.dl.sourceforge.net/project/mingw/Installer/mingw-get-setup.exe
这个下载器安装好,然后打开下载它所需要的包到C:\MinGW\var\cache\mingw-get\packages,怎么下载看我一篇关于编译gdal的文章。然后设备msys和mingw的bin到系统环境变量,后面就在CMake的时选择“msys mingw”这个编译器。如下图,编译时主要靠C:\MinGW\var\cache\mingw-get\packages里的包。
3.编译下面插件,然后放到3rdparty文件夹中,至于怎么放,我会面会说。 特别是编译之后的gdal药拷贝好多文件。
windows中编译,还得靠上面第3步下载的mingw,靠Qt自带的是不行的。打开mingw的shell如下图
输入命令,如 cd /c/osg进入到你要编译的osg路径或者curl ,gdal ,zli,jpeg....等等路径中(这里不需要全部编译,我就是编译了gdal ,curl,zlib这3个,其他的一些我在CMake里删除了,有需要了再编译吧),编译命令如下:
我把他们都贴过来。我编译curl是直接“mingw32-make mingw ”。下面就是编译插件的命令“
This is a cheatsheet for installing libraries in MinGW, be sure to setup a development environment according to this tutorial first: http://www.multigesture.net/articles/how-to-install-mingw-msys-and-eclipse-on-windows/
Be sure to apply the patch for building libtiff
In the shell:
Instructions taken from this site and this site
4.下载CMake ,osg3.4.0,osgdata和3rdparty .(最新的3rdparty编译时头文件有stdint.h这个文件通不过,于是下载来一个以前版本,可以用以前老版本的3rdparty搭配新版的osg和data),把3rdparty下的x64文件夹删除,把x86文件夹的文件考出来,和x86文件夹同一级就行了,后面设置3rdparty就省去了多余的目录,最好这么做,不然有些地方报错。
4.参考http://www.multigesture.net/articles/how-to-compile-openscenegraph-2-x-using-mingw/ 编译osg和3rdparty的设置 CMake里属性,完成编译。
这里是Qt5.3.0mingw关于Qt模块的配置,注意设置路径...................................................................................................,
错误处理,如果编译osg过程中出现了错误,不怕,主要原因还在第三方库,
主要现象有2个:(1)出现 " .....CPP找不到某个函数",3rdparty里有老版本的.h文件,你需要把编译的插件的新头文件拷贝到3rdparty的include里覆盖
(2)出现“。。@Ze..:"这样的乱码,然后你看看涉及到哪个库,“Builing...XX....”这里有能看。这是,你可以考虑删除CMake里这个属性,或者编译这个库,完了再回头编译osg。
最后是编译osgEarth ,注意编译的输出路径,如第一张图上的oe是我的源码,buildoe是我编译输出的文件,这2个文件要在同一级,不然报错。然后就是在编译osgEarth时设置CMake的osg属性了。注意否则会报错,如下图
OSG_DIR: D:/osg3.4/OpenSceneGraph-3.4.0 ;这是源码的路径
OSG_GE_INCLUDE_DIR: C:/Progam Files/OpenSceneGraph/include ; 这是osg安装的目录就是CMake osg时的prefix_intall ,再你编译osg时,再shell中输入make-install命令之后生成的目录
OSG_INCLUDE_DIR:C:/Progam Files/OpenSceneGraph/include ;同上
系统的环境变量要有,设置C:\MinGW\msys\1.0\bin;C:\MinGW\bin;这两个path要放在最前面否则会提示找不libstdc++-6.dll,后面跟着osg编译的bin , oe编译的bin, 3rdparty的bin.
命令行中使用 osgearth_version 测试 。
然后新建, OSG_FILE_PATH ,值:D:\OSG3.4\OpenSceneGraph-Data ;D:\OSG3.4\OpenSceneGraph-3.4.0;D:\OSG3.4\oe
如果找不到 zlib.dll, 将3rdparty里zlib1.dll改个名字。
新建Qt的GUI工程,下面就是在Qt使用时候的配置。然后把osgview嵌入到widget里,可以和qwidget嵌套使用
INCLUDEPATH+=C:/OpenSceneGraph/include
LIBS+=C:/OpenSceneGraph/lib/libOpenThreads.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosg.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgAnimation.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgDB.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgFX.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgGA.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgManipulator.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgParticle.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgPresentation.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgQt.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgShadow.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgSim.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgTerrain.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgText.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgUI.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgUtil.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgViewer.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgVolume.dll.a
LIBS+=C:/OpenSceneGraph/lib/libosgWidget.dll.a
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
osg::ref_ptr<osg::Node> loadedModel=osgDB::readNodeFile("cow.osg");
osgViewer::Viewer * ViewerWindow=new osgViewer::Viewer;
ViewerWindow->setCameraManipulator(new osgGA::TrackballManipulator);
ViewerWindow->setSceneData(loadedModel.get());
ViewerWindow->run();
return a.exec();
}