Fedora 11中用MinGW编译Windows的Qt4程序(在Linux系统下编译Windows的程序)
Ubuntu下可以直接安装:
sudo apt-get install mingw32 mingw32-binutils mingw32-runtime
安装后编译程序可以:
i586-mingw32msvc-g++(编译C++程序)
i586-mingw32msvc-gcc(编译C程序)
用法和gcc/g++非常类似。
如hello.c程序:
<ccid_nobr>
<ccid_code>
#include
int WINAPI WinMain (HINSTANCE hInstance,
|
编译:
i586-mingw32msvc-gcc hello.c -o hello.exe -mwindows
注:-mwindows指示其编译的是windows程序,若编译的是console(命令行)程序,则不需要这个参数。
若安装了wine,还可以测试一下这个程序:
wine hello.exe
-----------------------------------------------------------------------------
Fedora 11中用MinGW编译Windows的Qt4程序 琢磨了一上午,六级就放弃了……
前两天装上的F11,一大亮点就是Windows的交叉编译工具MinGW。决定尝试用MinGW编译Qt4程序。于是昨天去下载MinGW
#yum install mingw* -y
里面大部分库都是几百K,大的有上兆的,除了Qt库,100M。汗,Qt不愧是个万能库……电脑开了一宿,早上起来爽爽的看见 “Complete!”。这时默认的PATH下多了几个可执行文件,我就记住了mingw32-configure和mingw32-make,因为Qt 用qmake生成Makefile,不用configure,所以我没有用到mingw32-configure。打开控制台,进入一个Qt工程里,这时 才发现不知道怎么qmake,因为默认的qmake生成的是用GCC编译连接的。于是又用yumex查看mingw32-qt-qmake的已安装文件, 发现有一个/usr/lib/qt4/mkspecs/fedora-win32-cross/qmake.conf,嗯,应该就是用它了。于是:
$qmake-qt4 -spec /usr/lib/qt4/mkspecs/fedora-win32-cross
果然很顺利,生成了Makefile和Makefile.Release还有Makefile.Debug。接着:
$mingw32-make
咦,出错了……是连接的时候找不到“-lQtGui”。查看连接参数,找到“-L/usr/lib/i686-MinGW(后面忘记怎么拼了……) /sysroot/lib”,于是进入这个文件夹,看到有“libQtCore4.a”、“libQtGui4.a”什么的,所以有两种办法解决连接问 题:
1.一劳永逸法
就是在那个文件夹里建立符号链接,增加libQtCore.a==>libQtCore4.a什么的
2.临时修改法
不去建立符号链接,直接修改Makefile。打开Makefile.Release,找到链接参数LFLAGS那一行,把后面的“-lQtGui”改成 “-lQtGui4”,所有用到的Qt连接库都这样修改,加个4就OK了。
之后再$mingw32-make,嗯这回成功了。不过编译出来的文件就几十K,所以知道它用的是动态库。把exe文件copy到windows上,接着 去/usr/lib/i686-Min……/sysroot/bin,把里面的dll文件都copy到windows上去。重启进入Windows。注 意,如果直接运行那个exe文件,会提示缺少MSVCP80.DLL和MSVCR80.DLL,下载之后又说无法定位程序入口点。我几经折腾,发现不要管 这个提示,不需要这两个dll的。把libgcc_s_sjlj-1.dll、mingwm10.dll还有用到的Qt库dll(比如 QtCore4.dll什么的)copy到exe文件的目录中,运行,已经可以运行了,就是GUI程序总是多一个控制台窗口。去看Qt4 Assisstant,发现编写Windows程序的时候应该在.pro文件中指定是窗口程序还是控制台程序。于是再回到F11,修改.pro文件,增加 一行:
CONFIG += windows
再重新qmake、编译,但是出来的exe文件还没有改变。思考了良久,发现qmake的时候应该用win32模式:
$qmake-qt4 -spec /usr/lib/qt4/mkspecs/fedora-win32-cross -win32
这样再编译,出来的exe文件总算没有那个控制台了^o^
总结一下,交叉编译Windows平台的Qt4程序的步骤:
1.写代码,可以在native Linux上编译、调试
2.修改.pro文件,增加:
CONFIG += windows
3.执行:
$qmake-qt4 -spec /usr/lib/qt4/mkspecs/fedora-win32-cross -win32
4.修改Makefile.Release,找到LFLAGS = …… -lQtCore那些,把-lQtCore改成-lQtCore4,后面的-l参数类似。
5.执行:
$mingw32-make
6.发布exe文件,和libgcc_s_sjlj-1.dll、mingwm10.dll还有Qt*.dll(根据用到的库而定,比如用到 QtCore、QtGui、QtNetwork就发布QtCore4.dll、QtGui4.dll、QtNetwork4.dll)。那些dll文件在 /usr/lib/i686-mingw……(忘记全称了:-[)/sysroot/bin下面
7.就可以在Windows上运行啦^^
苍天保佑我的六级能过……唉,准备明年接着考……
http://www.programgo.com/article/11693899416/
http://tieba.baidu.com/p/733815195
Fedora 11中用MinGW编译Windows的Qt4程序(在Linux系统下编译Windows的程序)的更多相关文章
- Linux系统下安装windows字体笔记
源文档地址:https://www.e-iceblue.cn/spiredocforjavaconversion/word-to-pdf-font-issue.html windows字体路径:C:\ ...
- Mingw:在Linux系统下编译Windows的程序
Ubuntu下可以直接安装: sudo apt-get install mingw32 mingw32-binutils mingw32-runtime 安装后编译程序可以: i586-mingw32 ...
- linux系统下挂载windows共享目录
在工作中有时我们需要在linux上挂载windows共享目录.首先我们需要学会在linux上查看windows共享了那些目录.查看操作需要安装samba-client. [root@ ~]# yum ...
- Linux系统下编译连接C源代码
gcc test.c -o test 一步到位的编译指令 得到 test 文件 gcc test.c 得到 test.out 文件 gcc -g -c test.c -o test 只生成目标文件(. ...
- Linux系统GEDIT编译运行C++
作为NOIP第一年强制使用Linux系统的考生,真的很难受,被迫还要学一波Linux系统. 正常的Windows对于较基础的程序员来说非常方便好用,但是对于高级程序员来说就是一个坑,于是就有了Linu ...
- linux系统下,11款常见远程桌面控制软件
linux系统下,11款常见远程桌面控制软件 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图: 常见功能: 1.提供全屏,窗口化的远程控制.支持高分辨率下的 ...
- 在Linux Mint13下编译安装mono运行时
最近一直想体验下mono在web开发上到底进展到什么程度,挑战一下它对web开发的极限.因为asp.net mvc本身依赖windows平台的东西不太多,所以这些assembly移植到mono/lin ...
- linux系统下,11款常见远程桌面控制软件(转载)
远程控制能够给人们带来很多便利,本文介绍了11款常见的Linux系统下的远程桌面控制工具,总有一款能适合您. 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图 ...
- 【转帖】Windows与Linux系统下的库介绍
Windows与Linux系统下的库介绍 http://embeddedlinux.org.cn/emb-linux/entry-level/200903/12-553.html 库的定义 库文件是一 ...
随机推荐
- XMLHTTPRequest对象
1.用于在后台与服务器交换数据: 2.XMLHttpRequest对象可以在不向服务器提交整个页面的情况下,实现局部更新网页.当页面全部加载完毕后,客户端通过该对象向服务器请求数据, 服务器端接受数据 ...
- Unity3D中Update和Lateupdate的区别
Unity中Update和Lateupdate的区别.Lateupdate和Update每一祯都被执行,但是执行顺序不一样,先执行Updatee然后执行lateUpdate. 如果你有两个脚本JS1. ...
- JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈
toStirng()与Object.prototype.toString.call()方法浅谈 一.toString()是一个怎样的方法?它是能将某一个值转化为字符串的方法.然而它是如何将一个值从一种 ...
- setTimeout()和setInterval() 何时被调用执行
定义 setTimeout()和setInterval()经常被用来处理延时和定时任务.setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,而setInterval()则可以在每隔 ...
- 【BZOJ】3289: Mato的文件管理(莫队算法+树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=3289 很裸的莫队... 离线了区间然后分块排序后,询问时搞搞就行了. 本题中,如果知道$[l, r] ...
- 【SPOJ】7258. Lexicographical Substring Search(后缀自动机)
http://www.spoj.com/problems/SUBLEX/ 后缀自动机系列完成QAQ...撒花..明天or今晚写个小结? 首先得知道:后缀自动机中,root出发到任意一个状态的路径对应一 ...
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
当你看见这个标题的时候,你可能会下意识的去想一下,这两种方式到底有什么样的区别呢? 且看下面的demo,自然便区分开了 /** * */ package com.b510.test; /** * Pr ...
- CentOS Git的还原和操作
$ git log --graph --oneline $ git reset --hard 版本号 用 reflog 挽救错误的重置 [jackluo@localhost demo]$ git re ...
- asp.net 微信企业号办公系统-流程设计--流程步骤设置-按钮设置
按钮设置是配置当前步骤的处理者可以执行哪些操作,每个按钮都有对应的执行脚本(javascript脚本). 从左边的按钮列表中选择当前步骤需要的按钮. 注意:如果是流程最后一步则要配置完成按钮而不是发送 ...
- C# - 事物回滚
该功能依赖dbhelp.cs 传送门:http://www.cnblogs.com/CyLee/p/5324652.html 起始点,不能放在try语句中 this.DbHelp.BeginTrans ...