如何在 Linux 上与 MinGW 交叉编译 Windows?
How to cross-compile with MinGW on Linux for Windows?
我正在尝试使用 MinGW 在 Linux 上为 Windows 编译 Qt5 应用程序。
我正在使用 Travis-CI 来连续构建两个 windows 可执行文件(win32、win64)。
我已经设置了构建矩阵,其中包含不同 MinGW 依赖项的定义。 before-install
部分定义了 Qt、MinGW 和 gcc 依赖项。在 install
.
期间获取包
这是我的 .travis.yml
:
language: cpp
matrix:
fast_finish: true
include:
# cross-compile using mingw
- compiler: ": w64"
env: PLATFORM="mingw32" ARCH="x86_64" BITSIZE=64 HOST="x86_64"
- compiler: ": w32"
env: PLATFORM="mingw32" ARCH="x86" BITSIZE=32 HOST="i686"
install:
- sudo add-apt-repository --yes ppa:beineri/opt-qt54 # < Qt
- sudo add-apt-repository --yes ppa:tobydox/mingw-x-precise # < MinGW
- sudo apt-get update -qq
- uname -m
- sudo apt-get install qt54base qt54imageformats qt54tools -y -qq
- export QTDIR=/opt/qt54
- export PATH=$QTDIR/bin:$PATH
- export LD_LIBRARY_PATH=$QTDIR/lib/:$QTDIR/lib/`uname -m`-linux-gnu:$LD_LIBRARY_PATH
- sudo apt-get install -y cloog-isl mingw32
- if [ $BITSIZE == 32 ]; then sudo apt-get install -y mingw32-x-binutils mingw32-x-gcc mingw32-x-runtime; fi
- if [ $BITSIZE == 64 ]; then sudo apt-get install -y mingw64-x-binutils mingw64-x-gcc mingw64-x-runtime; fi
- export MINGW=/opt/mingw$BITSIZE
- export PATH=$MINGW/bin:$PATH
- export CC=$HOST-w64-mingw32-gcc
- export CXX=$HOST-w64-mingw32-g++
script:
- qmake -v
- qmake wpnxm-servercontrolpanel.pro CONFIG+=release QMAKE_CC=$CC QMAKE_CXX=$CXX
- gcc -v
- gcc -dumpmachine
- export CMAKE_OPTS="-DUSE_WERROR=ON"
- make -j2 VERBOSE=1
构建失败。
make
的输出包含
i686-w64-mingw32-g++ -c -pipe -O2 -std=c++0x -D_REENTRANT -Wall -W -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I/opt/qt54/mkspecs/linux-g++ -I. -I/opt/qt54/include -I/opt/qt54/include/QtWidgets -I/opt/qt54/include/QtGui -I/opt/qt54/include/QtNetwork -I/opt/qt54/include/QtCore -I. -I. -o mainwindow.o src/mainwindow.cpp
src/mainwindow.cpp:1:0: warning: -fPIC ignored for target (all code is position independent)
/*
^
src/mainwindow.cpp:41:21: fatal error: QCheckbox: No such file or directory
#include <QCheckbox>
^
compilation terminated.
发现:是QCheckBox.
我不确定我是否获取了正确版本的 Qt5。
构建可执行文件需要进行哪些更改?
首先,确保你有 mingw32、mingw32-binutils 和 mingw32-runtime 安装包。运行时包包含 cross-compiling 所需的所有常见 Windows headers,例如缺少的 "windows.h".
另请注意,您正在尝试 cross-compile 使用 Qt 库的 Linux 版本。这将在链接阶段失败。您需要所有所需依赖项的 mingw32 版本 (.DLL)。
由于 Travis 还不提供 mingw32 Qt 包,您必须从第三方来源安装它们(参见 http://docs.travis-ci.com/user/installing-dependencies/) like https://launchpad.net/~tobydox/+ppa-packages
我正在尝试使用 MinGW 在 Linux 上为 Windows 编译 Qt5 应用程序。
我正在使用 Travis-CI 来连续构建两个 windows 可执行文件(win32、win64)。
我已经设置了构建矩阵,其中包含不同 MinGW 依赖项的定义。 before-install
部分定义了 Qt、MinGW 和 gcc 依赖项。在 install
.
这是我的 .travis.yml
:
language: cpp
matrix:
fast_finish: true
include:
# cross-compile using mingw
- compiler: ": w64"
env: PLATFORM="mingw32" ARCH="x86_64" BITSIZE=64 HOST="x86_64"
- compiler: ": w32"
env: PLATFORM="mingw32" ARCH="x86" BITSIZE=32 HOST="i686"
install:
- sudo add-apt-repository --yes ppa:beineri/opt-qt54 # < Qt
- sudo add-apt-repository --yes ppa:tobydox/mingw-x-precise # < MinGW
- sudo apt-get update -qq
- uname -m
- sudo apt-get install qt54base qt54imageformats qt54tools -y -qq
- export QTDIR=/opt/qt54
- export PATH=$QTDIR/bin:$PATH
- export LD_LIBRARY_PATH=$QTDIR/lib/:$QTDIR/lib/`uname -m`-linux-gnu:$LD_LIBRARY_PATH
- sudo apt-get install -y cloog-isl mingw32
- if [ $BITSIZE == 32 ]; then sudo apt-get install -y mingw32-x-binutils mingw32-x-gcc mingw32-x-runtime; fi
- if [ $BITSIZE == 64 ]; then sudo apt-get install -y mingw64-x-binutils mingw64-x-gcc mingw64-x-runtime; fi
- export MINGW=/opt/mingw$BITSIZE
- export PATH=$MINGW/bin:$PATH
- export CC=$HOST-w64-mingw32-gcc
- export CXX=$HOST-w64-mingw32-g++
script:
- qmake -v
- qmake wpnxm-servercontrolpanel.pro CONFIG+=release QMAKE_CC=$CC QMAKE_CXX=$CXX
- gcc -v
- gcc -dumpmachine
- export CMAKE_OPTS="-DUSE_WERROR=ON"
- make -j2 VERBOSE=1
构建失败。
make
的输出包含
i686-w64-mingw32-g++ -c -pipe -O2 -std=c++0x -D_REENTRANT -Wall -W -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I/opt/qt54/mkspecs/linux-g++ -I. -I/opt/qt54/include -I/opt/qt54/include/QtWidgets -I/opt/qt54/include/QtGui -I/opt/qt54/include/QtNetwork -I/opt/qt54/include/QtCore -I. -I. -o mainwindow.o src/mainwindow.cpp
src/mainwindow.cpp:1:0: warning: -fPIC ignored for target (all code is position independent)
/*
^
src/mainwindow.cpp:41:21: fatal error: QCheckbox: No such file or directory
#include <QCheckbox>
^
compilation terminated.
发现:是QCheckBox.
我不确定我是否获取了正确版本的 Qt5。
构建可执行文件需要进行哪些更改?
首先,确保你有 mingw32、mingw32-binutils 和 mingw32-runtime 安装包。运行时包包含 cross-compiling 所需的所有常见 Windows headers,例如缺少的 "windows.h".
另请注意,您正在尝试 cross-compile 使用 Qt 库的 Linux 版本。这将在链接阶段失败。您需要所有所需依赖项的 mingw32 版本 (.DLL)。
由于 Travis 还不提供 mingw32 Qt 包,您必须从第三方来源安装它们(参见 http://docs.travis-ci.com/user/installing-dependencies/) like https://launchpad.net/~tobydox/+ppa-packages