[linux] Linux에서 Windows 대상으로의 교차 컴파일을 위해 Qt를 어떻게 구성합니까?

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 .

질문 :

  1. 리눅스 호스트에서 Windows 용 Qt는 뭔가를 크로스 컴파일 할 때, 네이티브 컴파일러한다 이제까지 호출? 즉, 크로스 컴파일 과정 에서 크로스 컴파일러 사용해야하지 않습니까? -xplatform옵션을 지정할 때 Qt의 구성 스크립트가 시스템의 네이티브 컴파일러를 호출하는 이유를 알 수 없습니다 .

  2. mingw 크로스 컴파일러를 사용하는 경우 언제 사양 파일을 처리해야합니까? GCC에 대한 사양 파일은 여전히 ​​나에게 일종의 미스터리이므로 여기에 배경이 도움이 될지 궁금합니다.

  3. 일반적으로 내 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 qtQt를 빌드하는 데 사용 하는 대신을 사용 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-mingw32MXE가 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.mkhttps://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

그래서

  1. msvcrt.dll (기본값) 이외의 것을 사용해야하는 경우에만. 다른 것을 사용한 적이 없어서 확실하지 않습니다.

  2. https://stackoverflow.com/a/18792925/32453 은 일부 구성 매개 변수를 나열합니다.


답변

Qt를 컴파일 configure하려면 호스트 플랫폼 -platform(예 : -platform linux-g++-64g ++ 컴파일러를 사용하여 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를 빌드하고 싶다고 가정 해 보겠습니다. 두 단계로 할 수 있습니다.

  1. Docker 컨테이너를 시작하십시오.

    sudo docker run -it burningdaylight / docker-mingw-qt5 / bin / bash

  2. QNapi 복제 및 컴파일

    git clone –recursive ‘https://github.com/QNapi/qnapi.git’cd qnapi / x86_64-w64-mingw32-qmake-qt5 make

그게 다야! 많은 경우에 그렇게 쉬울 것입니다. 패키지 저장소 (AUR)에 자체 라이브러리를 추가하는 것도 간단합니다. 가능한 한 직관적 인 PKBUILD 파일작성 해야합니다 . 예를 들어 mingw-w64-rapidjson을 참조하십시오 .


답변