Linux x86_64 호스트 머신을 사용하여 Windows x86_64 대상에 대한 Qt 라이브러리 (그리고 결국 내 애플리케이션)를 교차 컴파일하고 싶습니다. 친한 것 같지만이 과정의 일부에 대해 근본적인 오해가있을 수 있습니다.
내 Fedora 시스템에 모든 mingw 패키지를 설치 한 다음 win32-g++
내 환경에 맞게 qmake.conf 파일을 수정하여 시작했습니다. 그러나, 나는 Qt를위한 몇 가지 겉으로는 명백한 구성 옵션으로 붙어 받고있는 것으로 보인다 : -platform
와 -xplatform
. Qt 문서에 따르면 이것이 -platform
호스트 머신 아키텍처 (컴파일하는 곳)이고 -xplatform
배포하려는 대상 플랫폼이어야합니다. 제 경우에는 설정 -platform linux-g++-64
하고 -xplatform linux-win32-g++
linux-win32-g ++는 수정 된 win32-g ++ 구성입니다.
내 문제는 이러한 옵션으로 configure를 실행 한 후 크로스 컴파일러 (x86_64-w64-mingw32-gcc) 대신 내 시스템의 컴파일러를 호출한다는 것입니다. -xplatform
옵션을 생략하고 -platform
대상 사양 (linux-win32-g ++)으로 설정하면 크로스 컴파일러를 호출하지만 일부 유닉스 관련 함수가 정의되지 않은 경우 오류가 발생합니다.
다음은 최근 시도의 결과입니다. http://pastebin.com/QCpKSNev .
질문 :
-
리눅스 호스트에서 Windows 용 Qt는 뭔가를 크로스 컴파일 할 때, 네이티브 컴파일러한다 이제까지 호출? 즉, 크로스 컴파일 과정 에서 크로스 컴파일러 만 사용해야하지 않습니까?
-xplatform
옵션을 지정할 때 Qt의 구성 스크립트가 시스템의 네이티브 컴파일러를 호출하는 이유를 알 수 없습니다 . -
mingw 크로스 컴파일러를 사용하는 경우 언제 사양 파일을 처리해야합니까? GCC에 대한 사양 파일은 여전히 나에게 일종의 미스터리이므로 여기에 배경이 도움이 될지 궁금합니다.
-
일반적으로 내 qmake.conf에서 크로스 컴파일러를 지정하는 것 외에 고려해야 할 사항은 무엇입니까?
답변
그냥 사용 M 교차 환경 (MXE을) . 전체 프로세스에서 고통을 덜어줍니다.
-
그것을 얻으십시오 :
$ git clone https://github.com/mxe/mxe.git
-
빌드 종속성 설치
-
Windows 용 Qt, 종속성 및 교차 빌드 도구를 빌드합니다. 이것은 괜찮은 인터넷 접속이 가능한 빠른 기계에서 약 1 시간이 걸릴 것입니다. 다운로드 용량은 약 500MB입니다.
$ cd mxe && make qt
-
앱의 디렉터리로 이동하여 교차 빌드 도구를 PATH 환경 변수에 추가합니다.
$ export PATH=<mxe root>/usr/bin:$PATH
-
Qt Makefile 생성기 도구를 실행 한 다음 빌드합니다.
$ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
-
./release 디렉토리에서 바이너리를 찾아야합니다.
$ wine release/foo.exe
몇 가지 참고 사항 :
-
MXE 저장소의 마스터 브랜치를 사용하십시오. 개발팀으로부터 더 많은 사랑을받는 것 같습니다.
-
출력은 64 비트 Windows에서 잘 작동하는 32 비트 정적 바이너리입니다.
답변
(이것은 MXE가 답변 이후 진화 했으므로 @Tshepang의 답변 업데이트입니다)
Qt 구축
make qt
Qt를 빌드하는 데 사용 하는 대신을 사용 MXE_TARGETS
하여 대상 머신 및 도구 체인 (32 비트 또는 64 비트)을 제어 할 수 있습니다 . MXE는 빌드하려는 lib 유형을 표시하기 위해 .static
및 .shared
대상 이름의 일부로 사용하기 시작했습니다 .
# The following is the same as `make qt`, see explanation on default settings after the code block.
make qt MXE_TARGETS=i686-w64-mingw32.static # MinGW-w64, 32-bit, static libs
# Other targets you can use:
make qt MXE_TARGETS=x86_64-w64-mingw32.static # MinGW-w64, 64-bit, static libs
make qt MXE_TARGETS=i686-w64-mingw32.shared # MinGW-w64, 32-bit, shared libs
# You can even specify two targets, and they are built in one run:
# (And that's why it is MXE_TARGET**S**, not MXE_TARGET ;)
# MinGW-w64, both 32- and 64-bit, static libs
make qt MXE_TARGETS='i686-w64-mingw32.static x86_64-w64-mingw32.static'
@Tshepang의 원래 답변에서 그는를 지정하지 않았 MXE_TARGETS
으며 기본값이 사용됩니다. 그가 대답을 썼을 당시 기본값은 였지만 i686-pc-mingw32
이제는 i686-w64-mingw32.static
. 명시 적 MXE_TARGETS
으로 i686-w64-mingw32
, 생략 으로 설정 하면 .static
이 구문은 이제 더 이상 사용되지 않으므로 경고가 인쇄됩니다. 대상을로 설정하려고하면 i686-pc-mingw32
MXE가 MinGW.org (예 : i686-pc-mingw32)에 대한 지원을 제거했기 때문에 오류가 표시됩니다.
달리는 qmake
우리는 변화로 MXE_TARGETS
의 <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake
명령이 더 이상 작동 전혀 없이도 것입니다. 이제해야 할 일은 다음과 같습니다.
<mxe root>/usr/<TARGET>/qt/bin/qmake
지정하지 않은 경우 다음을 MXE_TARGETS
수행하십시오.
<mxe root>/usr/i686-w64-mingw32.static/qt/bin/qmake
업데이트 : 새 기본값은 이제i686-w64-mingw32.static
답변
좋아 내가 알아 낸 것 같아.
부분적으로 https://github.com/mxe/mxe/blob/master/src/qt.mk 및 https://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak 기반
configure (-xtarget 등으로)를 실행할 때 “처음에”나타나는 것처럼 보이며 구성한 다음 “hosts”gcc를 실행하여 로컬 바이너리 파일 ./bin/qmake를 빌드합니다.
./configure -xplatform win32-g++ -device-option CROSS_COMPILE=$cross_prefix_here -nomake examples ...
그런 다음 정상적인 “make”를 실행하고 mingw를 위해 빌드합니다.
make
make install
그래서
-
예
-
msvcrt.dll (기본값) 이외의 것을 사용해야하는 경우에만. 다른 것을 사용한 적이 없어서 확실하지 않습니다.
-
https://stackoverflow.com/a/18792925/32453 은 일부 구성 매개 변수를 나열합니다.
답변
Qt를 컴파일 configure
하려면 호스트 플랫폼 -platform
(예 : -platform linux-g++-64
g ++ 컴파일러를 사용하여 64 비트 Linux에서 빌드하는 경우)과 대상 플랫폼 -xplatform
(예 : -xplatform win32-g++
Windows로 크로스 컴파일하는 경우)을 지정하여 스크립트를 실행해야합니다. ).
또한이 플래그를 추가했습니다.이 플래그
-device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32-
는 사용중인 도구 모음의 접두사를 지정하며, Windows 용 바이너리를 빌드하는 모든 메이크 파일에서 ‘gcc’또는 ‘g ++’앞에 붙습니다.
마지막으로 Qt에 ActiveX 지원을 추가하는 데 사용되는 icd 를 빌드하는 동안 문제가 발생할 수 있습니다 . 플래그 -skip qtactiveqt
를 구성 스크립트 에 전달하여이를 방지 할 수 있습니다 . 이 버그 보고서에서 다음을 얻었습니다 : https://bugreports.qt.io/browse/QTBUG-38223
내가 사용한 전체 구성 명령은 다음과 같습니다.
cd qt_source_directory
mkdir my_build
cd my_build
../configure \
-release \
-opensource \
-no-compile-examples \
-platform linux-g++-64 \
-xplatform win32-g++ \
-device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- \
-skip qtactiveqt \
-v
당신의 질문에 관해서 :
1-예. 빌드 프로세스에 필요한 일부 도구를 빌드하기 위해 네이티브 컴파일러가 호출됩니다. 아마도 qconfig 또는 qmake와 같은 것일 수도 있지만 정확히 어떤 도구인지는 확실하지 않습니다.
2-죄송합니다. 컴파일러 = / 컨텍스트에서 사양 파일이 무엇인지 전혀 모릅니다. 그러나 내가 아는 한, 당신은 그것을 다룰 필요가 없을 것입니다.
3-위에서 언급 한 것처럼 qmake.conf 파일에서 수행하는 대신 configure 명령 줄에서 교차 컴파일러 접두사를 지정할 수 있습니다. 또한 내가 언급 한 해결 방법 인 idc의 문제도 있습니다.
답변
Linux에서 Windows 용 소프트웨어를 교차 컴파일하는 또 다른 방법은 Archlinux의 mingw-w64 도구 모음입니다. 사용 및 유지 관리가 쉽고 최신 버전의 컴파일러와 많은 라이브러리를 제공합니다. 개인적으로 MXE보다 더 쉽고 새로운 버전의 라이브러리를 더 빨리 채택하는 것 같습니다.
먼저 아치 기반 머신이 필요합니다 (가상 머신 또는 도커 컨테이너로 충분합니다). Arch Linux 일 필요는 없으며 파생 제품도 마찬가지입니다. Manjaro Linux를 사용했습니다. 대부분의 mingw-w64 패키지는 공식 Arch 저장소에서 사용할 수 없지만 AUR 에는 많이 있습니다. Arch (pacman) 용 기본 패키지 관리자는 AUR에서 직접 설치를 지원하지 않으므로 yay 또는 yaourt와 같은 AUR 래퍼를 설치하고 사용해야합니다. 그런 다음 Qt5 및 Boost 라이브러리의 mingw-w64 버전을 설치하는 것은 다음과 같이 쉽습니다.
yay -Sy mingw-w64-qt5-base mingw-w64-boost
#yaourt -Sy mingw-w64-qt5-base mingw-w64-qt5-boost #if you use yaourt
이렇게하면 mingw-w64 도구 모음 ( mingw-w64-gcc
) 및 기타 종속성 도 설치됩니다 . Windows (x64) 용 Qt 프로젝트를 크로스 컴파일하는 것은 다음과 같이 간단합니다.
x86_64-w64-mingw32-qmake-qt5
make
프로그램을 배포하려면 해당 dll 을 /usr/x86_64-w64-mingw32/bin/
. 예를 들어, 일반적으로 복사해야합니다 /usr/x86_64-w64-mingw32/lib/qt/plugins/platforms/qwindows.dll
으로 program.exe_dir/platforms/qwindows.dll
.
32 비트 버전을 얻으려면 i686-w64-mingw32-qmake-qt5
대신 사용하면 됩니다. Cmake 기반 프로젝트는 x86_64-w64-mingw32-cmake
. 이 접근 방식은 저에게 매우 효과적이었고 설정, 유지 및 확장이 가장 쉬웠습니다. 또한 지속적인 통합 서비스와도 잘 어울립니다. 거기 고정 표시기 이미지를 사용할 수도.
예를 들어 QNapi 자막 다운로더 GUI를 빌드하고 싶다고 가정 해 보겠습니다. 두 단계로 할 수 있습니다.
-
Docker 컨테이너를 시작하십시오.
sudo docker run -it burningdaylight / docker-mingw-qt5 / bin / bash
-
QNapi 복제 및 컴파일
git clone –recursive ‘https://github.com/QNapi/qnapi.git’cd qnapi / x86_64-w64-mingw32-qmake-qt5 make
그게 다야! 많은 경우에 그렇게 쉬울 것입니다. 패키지 저장소 (AUR)에 자체 라이브러리를 추가하는 것도 간단합니다. 가능한 한 직관적 인 PKBUILD 파일 을 작성 해야합니다 . 예를 들어 mingw-w64-rapidjson을 참조하십시오 .