Qt static compile

1.cd到Qt安装目录C:\Qt\qt-win-opensource-src-4.3.4

2,configure -static -release nmake sub-src

执行完就好了

==============

参考:

http://www.caole.net/diary/qt_deploy.html

引用说明:

本文原址链接:http://hi.baidu.com/jzinfo/blog/item/c17c3f6d4ff439fe431694c3.html

以下包括了部分网上收集的,以及qt帮助里的内容(Deploying an Application on Qt/Windows)

部署发布QT程序有两种方法

第一种,静态编译,可生成单一的可执行文件。 第二种,动态编译,需同时附上需要的dll文件。

一、静态编译

1 编译QT。

要静态编译,首先要求QT是静态编译过的。在QT目录下执行:

configure.exe -static -release make sub-src

就可以编译出静态库。如果只是用来分发程序,也可以mingw32-make release sub-src只编译一个静态库。
这个过程需要1-2个小时。QT目录会变成1.8G左右。注:mingw32-make和make是一样的。

如果用VC2005平台,在编译Qt的时候,configure.exe -static -platform win32-msvc2005 然后nmake
sub-src或者nmake release sub-src完成静态编译。

2 编译程序。

然后到你自己的程序目录下执行:

make clean qmake -config release make

这时会得到一个非常大的可执行程序,但也会有一个重要的问题,就是图片文件显示不出来。
按照QT帮助的说法,QT里的jpeg,gif等图片的支持都是以插件的形式存在的,现在我们还没有包含任何插件。

3 加入插件

在main.cpp里:

#include <QApplication>
#include <QtPlugin> //这个

Q_IMPORT_PLUGIN(qjpeg) //这个
Q_IMPORT_PLUGIN(qgif) //这个

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

return app.exec();
}


在.pro里加入:

QTPLUGIN += qjpeg qgif
CONFIG += static

QT的帮助里就做到这里,但我编译程序时出错如下:

release/main.o(.text+0×1c9):main.cpp:
undefined reference to `qt_plugin_instance_qgif()’
undefined reference to `qt_plugin_instance_qjpeg()’

经过长时间研究,发现了解决问题的办法:

4 加入LIBS

在.pro中加入: LIBS += C:/Qt/4.3.3/plugins/imageformats/libqgif.a LIBS +=
C:/Qt/4.3.3/plugins/imageformats/libqjpeg.a
如果QT静态编译正确的话,你应该上面这个目录下看到这两个文件libqgif.a和libqjpeg.a (据说以前的QT版本也可能是.lib或.o文件)

这时已经可以正常编译运行了。但还是需要mingwm10.dll才能运行。

5 解决MinGW的mingwm10.dll依赖问题

在Makefile.release里找到:

LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import
-Wl,-enable-runtime-pseudo-reloc -static -Wl,-s -Wl -mthreads -Wl,
-subsystem,windows

删除其中的”-mthreads”

quote:

一般只有用到 threads的时候才用到mingwm10.dll,我们通常遇到的”缺少mingwm10.dll”问题,可以在程序qmake生成
makefile.release文件后删除”-mthreads”参数即可,一般在
“LFLAGS”后面。当然,这只是临时解决方案,每次都要手动修改,也可以在编译QT前先修改qmake.h,不过不推荐这种方法。其实,
mingwm10.dll也就十多K,每次发布程序时一起打包也无所谓。 更多信息可以参考: http://lists.trolltech.com/qt-interest/2006-08/thread00942-0.html http://lists.trolltech.com/qt-interest/2005-10/thread00381-0.html#msg00553

这时编译同样得到一个非常大的可执行程序(我写的这个贪吃蛇一共500多行,生成的exe有8M)。用AspPack压缩一下。就可以发给用户了(这时是2.6M)。

quote:
“这样编译出来的程序比较大,可以先用strip命令去掉程序里面一些无用信息后,用ASPack或者UPX之类的压缩加壳软件压缩一下,两者的压缩率基本都达到30%多一点,压缩效果还是很明显的。”

二、动态编译

动态编译就很容易了。用QT的默认安装,把生成的release下的exe文件,和下面几个核心文件放在一个文件夹里:

MINGWM10.DLL QTGUI4.DLL QTCORE4.DLL

VC2005编译程序运行时需要的几个dll文件 Microsoft.VC80.CRT.manifest 位于x:\Program
Files\Microsoft Visual Studio 8\VC\redist\x86\\Microsoft.VC80.CRT msvcm80.dll
msvcp80.dll msvcr80.dll QtCore4.dll QtGui4.dll

这样就可以运行了。但图片文件还是可能显示不出来,解决办法:
把程序文件夹里,建立一个imageformats目录(必须是这个名字),把qt目录下的plugin/imageformats目录下对应的dll文件copy过去。这样动态连接就完成了。

注:可以用微软的Dependency Walker tool工具,就是一个depends.exe的程序,来查看一个exe文件跟哪些dll关联。

注:需要在完全没有装QT的系统上测试发布的程序有没有DLL依赖问题。

Author: Le Cao

Date: 2010-10-12 18:02:28 CST

HTML generated by org-mode TAG=7.01g in emacs 23

时间: 2024-08-01 22:45:16

Qt static compile的相关文章

QT static link App cmake CMakeLists.txt

project(ovw) cmake_minimum_required(VERSION 2.8) # turn on show compile cmd line SET( CMAKE_VERBOSE_MAKEFILE on ) SET(CMAKE_PREFIX_PATH "F:/Qt5.3.1/win32_static_2013") # Set source dir of cpp SET(SRC_DIR ${PROJECT_SOURCE_DIR}/..) SET(QTLIB_DIR &

static compile

package main import "fmt" type animal interface { Eat() } type cat struct { } func (c cat) Eat() { fmt.Println("Cat like to eat fish!") } var _ animal = (*cat)(nil) func main() { fmt.Println("test static compile") } 原文地址:http

Qt 5.9.3 如何静态编译和部署?

Qt 5.9.3 如何静态编译和部署? MSVC2015 x86 静态编译 Qt 部署静态库 VS2015 部署静态库 1. MSVC2015 x86 静态编译 1.1 Qt 官网下载最新源代码 立即下载 1.2 参考 Qt 官网提供的教程 Qt for Windows - Building from Source Qt Configure Options Qt for Windows - Requirements 参考上面文档后,发现需要安装以下依赖: ActivePerl Python 成功

Qt5.7.0配置选项(configure非常详细的参数)

configure是一个命令行工具,用于配置Qt编译到指定平台.configure必须运行于Qt源码根目录.当运行configure时,编译源码使用的是所选工具链中的make工具. 一.源码目录.编译目录和安装目录 源码目录就是包含源码的目录.编译目录是包含Makefiles文件.object文件和其他中间文件的目录.安装目录是二进制文件和库文件安装的目录. 当编译目录和源码目录不一样时,称为影子编译(shadow build),比如说,Qt Creator默认是使用影子编译来编译工程的.这里也

QT4.8.6静态编译

下载源安装程序,http://download.qt.io/archive/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz 解压 cd 进入解压后的目录,命令   ./configure -static -release -opensource -qt-zlib -qt-libpng -qt-libmng -qt-libjpeg -nomake demos -nomake examples -qt-sql-sqlite -prefix

qt-5.6.0 移植之编译

其实这只是给自己看的一个configure选项笔记,没有太多的东西. 首先: 下载qt5.6的源码: 地址: http://download.qt.io/archive/qt/5.6/ 下载完解压: tar  -xvf   qt-everywhere-opensource-src-5.6.0.tar.gz 解压完进入源代码 : 修改几个东西: 1. 进入qtbase/mkspecs 里面, 复制一份linux-arm-gnueabi-g++    ,名字为linux-arm 在进入 linux-

C++ vs Objective C

oc Short list of some of the major differences: C++ allows multiple inheritance, Objective-C doesn't.一个允许多继承,一个不允许Unlike C++, Objective-C allows method parameters to be named and the method signature includes only the names and types of the parameter

nim和面向对象(一)

Nim and OO 原文链接:http://goran.krampe.se/2014/10/29/nim-and-oo/ 作者:Roads less Taken A blend of programming, boats and life. 时间:2014,10,29 Nim is presented as an imperative language. And yes, it has some of its roots in the Pascal line of languages, but

linux中模块的构建,传参,和printk函数的简单使用

静态编译,动态加载应用想访问内核需要通过系统调用 驱动:1.模块(打包,加入内核)2.内核机制3.操作硬件 在Kconfig里面配置menuconfig的时候,不同的类型会在图形化界面的终端显示不用的配置选项:bool CONFIG_HELLO []hello_driver 两态tristate CONFIG_HELLO <>hello_driver 三态的 空 * Mstring/int CONFIG_HELLO ()hello_driver 相当于宏替换 (dest)hello_drive