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

总的来说,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

window下使用Qt _mingw32编译openscenegraph( osg) 和osgearth_第1张图片

准备工作: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里的包。

window下使用Qt _mingw32编译openscenegraph( osg) 和osgearth_第2张图片

3.编译下面插件,然后放到3rdparty文件夹中,至于怎么放,我会面会说。 特别是编译之后的gdal药拷贝好多文件。

windows中编译,还得靠上面第3步下载的mingw,靠Qt自带的是不行的。打开mingw的shell如下图

window下使用Qt _mingw32编译openscenegraph( osg) 和osgearth_第3张图片

输入命令,如 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 libtiff

  • download 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模块的配置,注意设置路径...................................................................................................,window下使用Qt _mingw32编译openscenegraph( osg) 和osgearth_第4张图片

错误处理,如果编译osg过程中出现了错误,不怕,主要原因还在第三方库,

主要现象有2个:(1)出现 " .....CPP找不到某个函数",3rdparty里有老版本的.h文件,你需要把编译的插件的新头文件拷贝到3rdparty的include里覆盖

    (2)出现“。。@Ze..:"这样的乱码,然后你看看涉及到哪个库,“Builing...XX....”这里有能看。这是,你可以考虑删除CMake里这个属性,或者编译这个库,完了再回头编译osg。

最后是编译osgEarth ,注意编译的输出路径,如第一张图上的oe是我的源码,buildoe是我编译输出的文件,这2个文件要在同一级,不然报错。然后就是在编译osgEarth时设置CMake的osg属性了。注意否则会报错,如下图


window下使用Qt _mingw32编译openscenegraph( osg) 和osgearth_第5张图片

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
 
  

window下使用Qt _mingw32编译openscenegraph( osg) 和osgearth_第6张图片

#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();
}




你可能感兴趣的:(window下使用Qt _mingw32编译openscenegraph( osg) 和osgearth)