您的位置:首页 > 编程语言 > Qt开发

window下使用Qt _mingw32编译openscenegraph( osg) 和osgearth

2018-01-08 21:02 1366 查看
总的来说,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 ”。下面就是编译插件的命令“
./configure –prefix=/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/

Libraries

Zlib

download zlib-1.2.5.tar.gz
tar -zxvf zlib-1.2.5.tar.gz
cd zlib-1.2.5
./configure –prefix=/mingw
make
make install
gcc -shared -o /mingw/bin/zlib1.dll -Wl,–out-implib=/mingw/lib/libz.dll.a [!em]*.o

Freetype

download freetype-2.3.12.tar.gz
tar -zxvf freetype-2.3.12.tar.gz
cd freetype-2.3.12
./configure –prefix=/mingw
make
make install

Curl

download curl-7.20.0.tar.gz
tar -zxvf curl-7.20.0.tar.gz
cd curl-7.20.0
./configure –prefix=/mingw
make
make install

Freeglut

download freeglut-2.6.0.tar.gz
tar -zxvf freeglut-2.6.0.tar.gz
cd freeglut-2.6.0
./configure –prefix=/mingw
make
make install

Glew

download glew-1.5.2.zip
unzip glew-1.5.2.zip
cd glew-1.5.2
make
make install GLEW_DEST=/mingw

SDL

download SDL-1.2.14.tar.gz
tar -zxvf SDL-1.2.14.tar.gz
cd SDL-1.2.14
./configure –prefix=/mingw
make
make install

Iconv

download libiconv-1.13.1.tar.gz
tar -zxvf libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
./configure –prefix=/mingw –enable-static=yes
make
make install

Giflib

download giflib-4.1.6.tar.gz
tar -zxvf giflib-4.1.6.tar.gz
cd giflib-4.1.6
./configure –prefix=/mingw
make
make install

Jpeg

download jpegsrc.v8a.tar.gz
tar -zxvf jpegsrc.v8a.tar.gz
cd jpeg-8a
./configure –prefix=/mingw
make
make install

Png

download libpng-1.4.1.tar.gz
tar -zxvf libpng-1.4.1.tar.gz
cd libpng-1.4.1
./configure –prefix=/mingw
make
make install

Tiff

Be sure to apply the patch for building libtiffdownload tiff-3.9.2.tar.gz
tar -zxvf tiff-3.9.2.tar.gz
cd tiff-3.9.2
./configure –prefix=/mingw
make
make install

Libxml2 (Precompiled)

Download pexports-0.43.zip
Unzip pexports.exe to C:/MinGW/bin
Download libxml2-2.7.6.win32.zip
Unzip libxml2-2.7.6.win32.zip to C:/MinGW
In the shell:cd /mingw/bin
pexports libxml2.dll > libxml2.def
dlltool –dllname libxml2.dll –def libxml2.def –output-lib ../lib/libxml2.a
Instructions taken from this site and this site

Boost

download boost_1_42_0.tar.gz
tar -zxvf boost_1_42_0.tar.gz
copy boost dir (with header files) to /mingw/include
上面编译的插件全部放在3rdparty里,zlib的头文件和gdal编译后的几个文件头文件全部放在include里,否则编译osg会找不到头文件
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 <QApplication>
#include <osg/ArgumentParser>
#include <osgViewer/Viewer>
#include <osgViewer/CompositeViewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/TrackballManipulator>
#include <osgDB/ReadFile>
#include <QtCore/QString>
#include <QtCore/QTimer>
#include <QtGui/QKeyEvent>
#include <QtOpenGL/QGLWidget>
#include <osgWidget/Widget>
#include <iostream>
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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: