zoukankan      html  css  js  c++  java
  • 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,
    HINSTANCE hPrevInstance,
    PSTR szCmdLine,
    int iCmdShow)
    {
    MessageBox (NULL, "Hello", "Hello Demo", MB_OK);
    return (0);
    }
                
                

    编译:

    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

  • 相关阅读:
    发布NBearV3最终测试版v3.2.5
    NBearV3教程——Web篇
    JUnit中的设计模式:命令模式
    HTTP协议 通信过程介绍
    JUnit中的设计模式:适配器模式
    《Head First设计模式》 读书笔记15 其余的模式(一) 桥接 生成器 责任链
    SQL基础:数据库规范化与三范式
    《Head First设计模式》 读书笔记13 复合模式 MVC模式
    Android Tab标签的使用基础
    Android设备上的传感器模拟工具:SensorSimulator
  • 原文地址:https://www.cnblogs.com/findumars/p/6251002.html
Copyright © 2011-2022 走看看