Làm cách nào để cấu hình Qt để biên dịch chéo từ Linux sang Windows target?


81

Tôi muốn biên dịch chéo các thư viện Qt (và cuối cùng là ứng dụng của tôi) cho mục tiêu Windows x86_64 bằng máy chủ Linux x86_64. Tôi cảm thấy như tôi đã gần gũi, nhưng tôi có thể có sự hiểu lầm cơ bản về một số phần của quá trình này.

Tôi đã bắt đầu bằng cách cài đặt tất cả các gói mingw trên máy Fedora của mình và sau đó sửa đổi win32-g++tệp qmake.conf để phù hợp với môi trường của tôi. Tuy nhiên, tôi dường như đang gặp khó khăn với một số tùy chọn cấu hình dường như rõ ràng cho Qt: -platform-xplatform. Tài liệu Qt nói rằng đó -platformphải là kiến ​​trúc máy chủ (nơi bạn đang biên dịch) và -xplatformphải là nền tảng đích mà bạn muốn triển khai. Trong trường hợp của tôi, tôi đặt -platform linux-g++-64và đặt -xplatform linux-win32-g++linux-win32-g ++ là cấu hình win32-g ++ đã sửa đổi của tôi.

Vấn đề của tôi là, sau khi thực hiện cấu hình với các tùy chọn này, tôi thấy rằng nó gọi trình biên dịch của hệ thống của tôi thay vì trình biên dịch chéo (x86_64-w64-mingw32-gcc). Nếu tôi bỏ qua -xplatformtùy chọn và đặt thành -platformthông số mục tiêu của mình (linux-win32-g ++), nó sẽ gọi trình biên dịch chéo nhưng sau đó sẽ xảy ra lỗi khi tìm thấy một số hàm liên quan đến Unix không được xác định.

Đây là một số kết quả từ lần thử mới nhất của tôi: http://pastebin.com/QCpKSNev .

Câu hỏi:

  1. Khi biên dịch chéo một cái gì đó như Qt cho Windows từ máy chủ Linux, có bao giờ nên gọi trình biên dịch gốc không? Đó là, trong quá trình biên dịch chéo, chúng ta không nên chỉ sử dụng trình biên dịch chéo? Tôi không hiểu tại sao tập lệnh cấu hình của Qt cố gắng gọi trình biên dịch gốc của hệ thống của tôi khi tôi chỉ định -xplatformtùy chọn.

  2. Nếu tôi đang sử dụng trình biên dịch chéo mingw, khi nào tôi sẽ phải xử lý tệp thông số kỹ thuật? Các tệp thông số kỹ thuật cho GCC vẫn còn là một bí ẩn đối với tôi, vì vậy tôi đang tự hỏi liệu một số thông tin cơ bản ở đây có giúp được tôi không.

  3. Nói chung, ngoài việc chỉ định một trình biên dịch chéo trong qmake.conf của tôi, tôi có thể cần xem xét điều gì khác?


2
Tôi tin rằng nó cần một bản dựng cục bộ của qmake để khởi động phần còn lại của bản dựng. xem thêm các liên kết trong stackoverflow.com/questions/1025687/…
Martin Beckett

Được rồi, cái đó có lý. Bây giờ tôi vừa tìm thấy một vấn đề khác, dường như tôi đang trộn lẫn giữa các phương tiện công cụ gốc và chéo. Lỗi trong đầu ra pastebin của tôi dường như là do gọi x86_64-w64-mingw32-asthay vì gọi gốc.
Ông Shickadance

2
Tôi hiếm khi đánh dấu một câu hỏi SO là yêu thích nhưng đây là một câu hỏi độc đáo và thú vị với một câu trả lời tuyệt vời.
jdi 12/12/12

Câu trả lời:


70

Chỉ cần sử dụng môi trường chéo M (MXE) . Nó loại bỏ nỗi đau trong toàn bộ quá trình:

  • Hiểu rồi:

    $ git clone https://github.com/mxe/mxe.git
    
  • Cài đặt phụ thuộc bản dựng

  • Xây dựng Qt cho Windows, các phụ thuộc của nó và các công cụ xây dựng chéo; điều này sẽ mất khoảng một giờ trên một máy nhanh có truy cập internet tốt; tải xuống khoảng 500MB:

    $ cd mxe && make qt
    
  • Đi tới thư mục của ứng dụng của bạn và thêm các công cụ xây dựng chéo vào biến môi trường PATH :

    $ export PATH=<mxe root>/usr/bin:$PATH
    
  • Chạy công cụ tạo tệp Makefile Qt sau đó xây dựng:

    $ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
    
  • Bạn sẽ tìm thấy tệp nhị phân trong thư mục ./release:

    $ wine release/foo.exe
    

Một số lưu ý :

  • Sử dụng nhánh chính của kho lưu trữ MXE; nó dường như nhận được nhiều tình cảm hơn từ nhóm phát triển.

  • Đầu ra là một tệp nhị phân tĩnh 32-bit, sẽ hoạt động tốt trên Windows 64-bit.


17
lưu ý : các hướng dẫn này áp dụng cho Qt 4; cho Qt 5, xem stackoverflow.com/a/14170591
tshepang

Trước khi thực hiện, $ cd mxe && make qtbạn nên cài đặt các yêu cầu. Đối với hệ thống Debian, điều này có nghĩa là 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. Đối với các hệ thống khác, hãy xem mxe.cc/#requirements
Martin Thoma

16

(Đây là bản cập nhật cho câu trả lời của @ Tshepang, vì MXE đã phát triển kể từ câu trả lời của anh ấy)

Tòa nhà Qt

Thay vì sử dụng make qtđể xây dựng Qt, bạn có thể sử dụng MXE_TARGETSđể điều khiển máy mục tiêu và chuỗi công cụ của mình (32 hoặc 64-bit). MXE bắt đầu sử dụng .static.sharedlà một phần của tên đích để hiển thị loại lib bạn muốn tạo.

# 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'

Trong câu trả lời ban đầu của @ Tshepang, anh ấy không chỉ định một MXE_TARGETSvà giá trị mặc định được sử dụng. Vào thời điểm anh ấy viết câu trả lời của mình, mặc định là i686-pc-mingw32, bây giờ là i686-w64-mingw32.static. Nếu bạn một cách rõ ràng thiết lập MXE_TARGETSđể i686-w64-mingw32, bỏ qua .static, một cảnh báo được in vì cú pháp này hiện đang bị phản đối. Nếu bạn cố gắng đặt mục tiêu thành i686-pc-mingw32, nó sẽ hiển thị lỗi vì MXE đã xóa hỗ trợ cho MinGW.org (tức là i686-pc-mingw32).

Đang chạy qmake

Khi chúng tôi thay đổi MXE_TARGETS, <mxe root>/usr/i686-pc-mingw32/qt/bin/qmakelệnh sẽ không hoạt động nữa. Bây giờ, những gì bạn cần làm là:

<mxe root>/usr/<TARGET>/qt/bin/qmake

Nếu bạn không chỉ định MXE_TARGETS , hãy làm như sau:

<mxe root>/usr/i686-w64-mingw32.static/qt/bin/qmake

Cập nhật: Mặc định mới hiện lài686-w64-mingw32.static


Cảm ơn rất nhiều cho bản cập nhật. Cũng tốt khi có người làm việc trực tiếp trong dự án phản hồi.
tshepang

3
Đây đáng lẽ phải là một bản chỉnh sửa / cập nhật cho câu trả lời kia, không phải là một câu trả lời mới.
WhyNotHugo

3
@Hugo. Nó là một phần mở rộng của câu trả lời của Tshepang.
Timothy Gu

Tôi không hiểu câu trả lời này, khi tôi nhập "make qt ....", nó chỉ phản hồi với "không có quy tắc để tạo mục tiêu qt".
Mine

4

Ok, tôi nghĩ rằng tôi đã tìm ra nó.

Một phần dựa trên https://github.com/mxe/mxe/blob/master/src/qt.mkhttps://www.videolan.org/developers/vlc/contrib/src/qt4/rules.mak

Có vẻ như "ban đầu" khi bạn chạy config (với -xtarget, v.v.), nó sẽ cấu hình sau đó chạy gcc "hosts" của bạn để tạo tệp nhị phân cục bộ ./bin/qmake

 ./configure -xplatform win32-g++ -device-option CROSS_COMPILE=$cross_prefix_here -nomake examples ...

sau đó bạn chạy "make" bình thường và nó xây dựng nó để kết hợp

  make
  make install

vì thế

  1. Đúng

  2. chỉ khi bạn cần sử dụng thứ gì đó khác ngoài msvcrt.dll (mặc định của nó). Mặc dù tôi chưa bao giờ sử dụng bất cứ thứ gì khác nên tôi không biết chắc chắn.

  3. https://stackoverflow.com/a/18792925/32453 liệt kê một số tham số cấu hình.


4

Để biên dịch Qt, người ta phải chạy configuretập lệnh của nó , chỉ định nền tảng máy chủ với -platform(ví dụ: -platform linux-g++-64nếu bạn đang xây dựng trên linux 64-bit với trình biên dịch g ++) và nền tảng đích với -xplatform(ví dụ:-xplatform win32-g++ nếu bạn đang biên dịch chéo sang windows ).

Tôi cũng đã thêm cờ này: cờ -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- này chỉ định tiền tố của chuỗi công cụ tôi đang sử dụng, tiền tố này sẽ được thêm vào trước 'gcc' hoặc 'g ++' trong tất cả các tệp makefiles đang tạo mã nhị phân cho windows.

Cuối cùng, bạn có thể gặp sự cố khi xây dựng icd , rõ ràng là thứ được sử dụng để thêm hỗ trợ ActiveX cho Qt. Bạn có thể tránh điều đó bằng cách chuyển cờ -skip qtactiveqtcho tập lệnh cấu hình. Tôi đã nhận được cái này từ báo cáo lỗi này: https://bugreports.qt.io/browse/QTBUG-38223

Đây là toàn bộ lệnh cấu hình tôi đã sử dụng:

    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

Đối với câu hỏi của bạn:

1 - Có. Trình biên dịch gốc sẽ được gọi để xây dựng một số công cụ cần thiết trong quá trình xây dựng. Có thể những thứ như qconfig hoặc qmake, nhưng tôi không hoàn toàn chắc chắn chính xác là công cụ nào.

2 - Xin lỗi. Tôi không biết các tệp thông số kỹ thuật là gì trong ngữ cảnh của trình biên dịch = /. Nhưng theo như tôi biết, bạn sẽ không phải đối phó với điều đó.

3 - Bạn có thể chỉ định tiền tố trình biên dịch chéo trong dòng lệnh cấu hình thay vì thực hiện nó trong tệp qmake.conf, như đã đề cập ở trên. Và cũng có vấn đề đó với idc, cách giải quyết mà tôi đã đề cập.


4

Một cách khác để biên dịch chéo phần mềm cho Windows trên Linux là chuỗi công cụ mingw-w64 trên Archlinux. Nó dễ sử dụng và bảo trì, đồng thời cung cấp các phiên bản gần đây của trình biên dịch và nhiều thư viện. Cá nhân tôi thấy nó dễ dàng hơn MXE và nó dường như áp dụng các phiên bản thư viện mới hơn nhanh hơn.

Đầu tiên, bạn sẽ cần một máy dựa trên vòm (máy ảo hoặc bộ chứa docker là đủ). Nó không nhất thiết phải là Arch Linux, các dẫn xuất cũng sẽ làm được. Tôi đã sử dụng Manjaro Linux. Hầu hết các gói mingw-w64 không có sẵn tại kho lưu trữ chính thức của Arch, nhưng có rất nhiều trong AUR . Trình quản lý gói mặc định cho Arch (pacman) không hỗ trợ cài đặt trực tiếp từ AUR, vì vậy bạn sẽ cần phải cài đặt và sử dụng trình bao bọc AUR như yay hoặc yaourt. Sau đó cài đặt phiên bản mingw-w64 của Qt5 và thư viện Boost dễ dàng như sau:

yay -Sy mingw-w64-qt5-base mingw-w64-boost
#yaourt -Sy mingw-w64-qt5-base mingw-w64-qt5-boost #if you use yaourt

Thao tác này cũng sẽ cài đặt chuỗi công cụ mingw-w64 ( mingw-w64-gcc) và các phụ thuộc khác. Biên dịch chéo một dự án Qt cho windows (x64) sau đó đơn giản như:

x86_64-w64-mingw32-qmake-qt5
make

Để triển khai chương trình của bạn, bạn sẽ cần sao chép các dlls tương ứng từ /usr/x86_64-w64-mingw32/bin/. Ví dụ: bạn thường cần sao chép /usr/x86_64-w64-mingw32/lib/qt/plugins/platforms/qwindows.dllvào program.exe_dir/platforms/qwindows.dll .

Để có được phiên bản 32bit, bạn chỉ cần sử dụng i686-w64-mingw32-qmake-qt5thay thế. Các dự án dựa trên Cmake hoạt động dễ dàng như vậy x86_64-w64-mingw32-cmake. Cách tiếp cận này rất hiệu quả đối với tôi, là cách dễ dàng nhất để thiết lập, duy trì và mở rộng. Nó cũng hoạt động tốt với các dịch vụ tích hợp liên tục. Có cả hình ảnh docker .

Ví dụ: giả sử tôi muốn xây dựng GUI của trình tải xuống phụ đề QNapi. Tôi có thể làm điều đó trong hai bước:

  1. Khởi động vùng chứa docker:

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

  2. Sao chép và biên dịch QNapi

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

Đó là nó! Trong nhiều trường hợp, nó sẽ dễ dàng như vậy. Thêm thư viện của riêng bạn vào kho lưu trữ gói (AUR) cũng rất đơn giản. Bạn sẽ cần phải viết một tệp PKBUILD trực quan nhất có thể, xem ví dụ: mingw-w64-quickjson .


Để triển khai, bạn phải sao chép tất cả các Qt DLL bắt buộc (hoặc doc.qt.io/qt-5/windows-deployment.html ). Đảm bảo sao chép /mingw64/share/qt5/plugins/platforms/qwindows.dll vào platform / qwindows.dll.
develCuy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.