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


81

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에서 크로스 컴파일러를 지정하는 것 외에 고려해야 할 사항은 무엇입니까?


2
나머지 빌드를 부트 스트랩하려면 qmake의 로컬 빌드가 필요하다고 생각합니다. 또한 링크 참조 stackoverflow.com/questions/1025687/...
— 마틴 베켓

알겠습니다. 이제 또 다른 문제를 발견했습니다. 네이티브 및 크로스 툴체인을 혼합하는 것 같습니다. 내 pastebin 출력의 오류 x86_64-w64-mingw32-as는 네이티브 대신 호출로 인한 것 같습니다 .
— Mr. Shickadance 2012-06-07

2
나는 SO 질문을 즐겨 찾기로 표시하는 경우가 거의 없지만 이것은 멋진 답변이있는 독특하고 흥미로운 질문이었습니다.
— jdi

답변:


70

그냥 사용 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 비트 정적 바이너리입니다.


17
참고 :이 지침은 Qt 4에 적용됩니다. Qt는 5 참조 stackoverflow.com/a/14170591
— tshepang

실행하기 전에 $ cd mxe && make qt요구 사항을 설치해야합니다. 데비안 시스템의 경우 이것은 sudo apt-get install autoconf automake autopoint bash bison bzip2 cmake flex gettext git g++ gperf intltool libffi-dev libtool libltdl-dev libssl-dev libxml-parser-perl make openssl patch perl pkg-config python ruby scons sed unzip wget xz-utils. 다른 시스템을 참조 mxe.cc/#requirements
— 마틴 토마스

16

(이것은 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


업데이트 해주셔서 감사합니다. 프로젝트에서 직접 작업하는 사람이 응답하도록하는 것도 좋습니다.
— tshepang 2014-08-15

3
이것은 새로운 답변이 아니라 다른 답변에 대한 편집 / 업데이트 여야합니다.
— WhyNotHugo

3
@Hugo 편집 페이지 내용 : 편집 방법 : ► 문법 또는 철자 오류 수정 ► 변경하지 않고 의미 명확화 ► 사소한 실수 수정 ► 관련 리소스 또는 링크 추가 ► 항상 원저자를 존중합니다. Tshepang의 대답의 확장입니다.
— Timothy Gu

이 대답을 이해하지 못합니다. "make qt ...."라고 입력하면 '타겟 qt를 만드는 규칙이 없습니다'라고 응답합니다.
— Mine

4

좋아 내가 알아 낸 것 같아.

부분적으로 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

그래서

  1. 예

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

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


4

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의 문제도 있습니다.


4

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을 참조하십시오 .


배포를 위해 필요한 모든 Qt DLL (또는 doc.qt.io/qt-5/windows-deployment.html ) 을 복사해야합니다 . /mingw64/share/qt5/plugins/platforms/qwindows.dll이 platform / qwindows.dll에 복사되는지 확인하십시오.
— develCuy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.