MingW跨平台编译QT VTK

本人是小研究生一枚,在实验室负责跟通用公司合作的一个关于CAD的项目, 在项目中用到的开发环境是, C++, QT ,VTK. C++, Cmake, Emacs, SVN用来实现算法, QT实现用户交互, VTK实现可视化。Cmake用来组织工程 Emacs编译器(初始的时候是个文本编辑器,需要进行一些配置安装一些插件网上有许多的教程),SVN负责版本控制,用于团队开发的时候版本的控制(其实也没有涉及到团队,整个工程都是我一个人在开发),但是用svn还是比较方便的,你不用担心因为你的某些修改导致工程无法运行,你就可能要花费大量的时间找出bug。用svn管理后你如果觉得错误很难找到,完全可以恢复到之前某个稳定正确的版本上,非常省心。

在开发阶段是在ubuntu下进行的,因为ubuntu下用用第三方的库比较方便简单。在软件源上安装完即可以使用。而且本人不喜欢windows的 vs系列编译器 因为不同版本的vs会有不同的动态运行库(很蛋疼),相信不少人都遇到过类似的情况。所以我更追求一个可以完全跨平台的工程组织工具,编译器,第三方库。上面提到的那些东西都是跨平台的。 

追求跨平台说起来很容易,但是做起来确实有些头疼。项目到了阶段性验收的时候,对方要求windows的可执行程序。所以我也是被逼无奈的要编译出一个Windows的release版本的可执行程序。关于Debug和Release版本的程序相信大家应该都是很清楚的。这里就不再班门弄斧了。下面就开始我的编译旅程吧。

在编译的过程中走过很多的弯路,简单的说一下,以免大家重蹈覆辙, 我一心想要快速的搞定这件事情,所以一开始就是对编译qt和vtk的源码很抵触。所以从qt官网上下载了一个release(用MingW编译的) ,然后我试图在VTK观望上找到我想要的release 但是发现失败了,不是使用的Mingw版本不同,就是没有64bit的。VTK编译的时候是学要qt库要生成一个叫做libqvtk的库,所以这条路宣告失败其实是当我用下载下来的qt库编译VTK后在编译我的工程后,发现可执行程序无法运行后,痛定思痛才觉得可能是一这两个库使用的编译器版本不一样导致的错误。

所以,这次下定决心从头再来,这次我没有对以后的ku报任何幻想,我决定QT,VTK的库自己用MingW32-w64编译。让所有的东西都在掌控之中。不依赖于别的东西。 首先,你需要下载并安装MingW-64位的release版本,需要在http://qt-project.org/downloads下载QT源码。我下载的是4.8.4版本。下载后的目录结构:
下载后安装好的目录结构为(假设安装到D:\QT):
├─share
├─lib
├─bin
├─mingw
└─qt
    ├─translations(QT语言文件目录)
    ├─tools(QT相关工具源码目录)
    ├─src(源代码目录)
    ├─qmake(qmake源代码目录)
    ├─plugins(图形,数据库等插件目录)
    ├─mkspecs(平台配置文件)
    ├─lib(库文件)
    ├─include(头文件)
    ├─examples(示例程序)
    ├─doc(文档)
    ├─demos(演示程序)
    ├─config.tests
    ├─bin(命令行工具)
    └─qtc-debugging-helper
1.设置MinGW的环境变量
2.设置目标平台
set QMAKESPEC=win32-g++
3.修改 mkspecs/win32-g++目录下的配置文件qmake.conf(其实也可以不用修改, 在配置的时候加上你要配置的选项)
将下面一行:
QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
修改为:
QMAKE_LFLAGS = -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
然后将下面一行:
QMAKE_LFLAGS_DLL        = -shared //生成dll
修改为:
QMAKE_LFLAGS_DLL        = -static//生成静态库
4.QTDIR目录,运行配置,生成Makefile文件
set QMAKESPEC=win32-g++
configure -platform win32-g++ -release -no-exceptions -opensource -static -fast -nomake tests -nomake examples -qt-sql-sqlite -plugin-sql-sqlite -qt-zlib -no-webkit 

-platform win32-msvc2005 目标平台
-release 关闭调试信息
-no-exceptions 除去异常支持
-opensource 开源

-nomake tests不对tests目录进行编译节省时间

-nomake examples 不对examples目录编译
-static 创建静态库
-fast 快速配置,只生成Qt库文件及子目录的Makefile文件,其它的Makefile文件后面再使用qmake生成
-qt-sql-sqlite SQLite驱动支持
-plugin-sql-sqlite  SQLite链接插件支持
-no-qt3support  不编译Qt3兼容库
-qt-zlib zlib库(这个是qt在编译的时候需要用到一些压缩算法,所以要调用zlib库,加了这个选线代表使用qt自带的zlib库,我理解如果不加入这个选项,就会在系统中找相应的压缩库, 我编译的时候一开始没有加所以在编译我的工程时候会报错,所以我在网上找了一个开源的zlib 可以在这里下载,

zlib.zip

 115网盘礼包接收地址:http://115.com/lb/5lbqelvs 

115网盘礼包码:5lbqelvs)

或者:

http://www.kuaipan.cn/file/id_16050443109007451.htm


-qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg 图形格式插件库
-no-webkit 不编译webkit,此选项可极大加快编译速度,需要使用WebKit的可以删除此选项

5.运行运行mingw32-make -j 4(-j 4是用来对编译加速的,加上之后速度快了很多)

在编译成功后lib下生成一堆.a文件(我编译成了静态库,避免传给对方程序时候携带太多的动态连接库)我编译成功后的静态连接库可以在这里下到:http://www.kuaipan.cn/file/id_16050443109007450.htm。是64位版本的。

编译完QT后下面开始编译VTK。这是一项艰巨的任务,但是比QT简单些而且要快些。

首先安装去Cmake观望下载cmake,然后安装

首先去官网下载它的源代码,http://vtk.org/VTK/resources/software.html 我下的版本是5.8.0 

 Vtk-5.8.0.zip    vtk 的源码

  vtkdata-5.8.0.zip  vtk例子所需要的数据 

打开cmake 然后选择源码,和要安装的路径如下图:



然后configure弹出如下对话框:

MingW跨平台编译QT VTK_第1张图片

这是要你选择编译器,我选择了MingW,里面有很多编译器可以选择,VS,codeblock等。Cmake选项很重要,因为你未来 VTK 的一些功能完全在你的选择上了。有时候选择不好非常容易出现错误。下面是已经配置好的 cmake 的截图:

MingW跨平台编译QT VTK_第2张图片

还有下面的两个选项:


如果你刚才编译QT的时候没有用qt自带的zlib,在这里你就要使用你自己的zlib在上面我给出了我用的zlib 的下载地址了。

在编译VTK的时候需要QT的一些可执行程序,所以你要确保Cmake找到了,

下面的选项很重要:


还有一个很关键的选项,就是VTK在windows系统中实现可视化有两种选择,1,选择Direct X 2.选择Opengl。我当然是要选择Opengl,因为Opengl是跨平台的,本文的主要宗旨就是在追求完全的跨平台。而Direct X直接与我的宗旨相矛盾,必须根除。所以摄者Direct X的头文件和库函数的目录为空。


修改了一些选项后要重新configure,完成后点击generate生成make文件。然后可以用MingW32-make -j 4进行编译我编译成功的VTK库可以在http://www.kuaipan.cn/file/id_16050443109007448.htm下载。

当这两个库都编译成功后,就可以编译我自己的工程了。在这里就不详细说了,因为不具备普遍性。今天就讲到这里,希望对将要对读者有所帮助节省一些时间,时间就是金钱。呵呵。

你可能感兴趣的:(c++,linux,编程,编译)