मैं लिनक्स से विंडोज लक्ष्य तक क्रॉस-संकलन के लिए क्यूटी को कैसे कॉन्फ़िगर करूं?


82

मैं लिनक्स x86_64 होस्ट मशीन का उपयोग करके Windows x86_64 लक्ष्य के लिए Qt पुस्तकालयों (और अंततः मेरे आवेदन) को पार करना चाहता हूं। मुझे लगता है कि मैं करीब हूं, लेकिन मुझे इस प्रक्रिया के कुछ हिस्सों की बुनियादी गलतफहमी हो सकती है।

मैंने अपने फेडोरा मशीन पर सभी win32-g++मिंगव पैकेज स्थापित करके शुरू किया और फिर अपने वातावरण को फिट करने के लिए qmake.conf फ़ाइल को संशोधित किया । हालाँकि, मुझे लगता है कि Qt: -platformऔर के लिए कुछ स्पष्ट रूप से कॉन्फ़िगर किए गए विकल्पों के साथ फंस गए हैं -xplatform। क्यूटी प्रलेखन कहता है कि -platformमेजबान मशीन वास्तुकला (जहां आप संकलित कर रहे हैं) -xplatformहोना चाहिए और वह लक्ष्य मंच होना चाहिए जिसके लिए आप तैनात करना चाहते हैं। मेरे मामले में, मैंने सेट किया -platform linux-g++-64और -xplatform linux-win32-g++कहां linux-win32-g ++ मेरा संशोधित win32-g ++ कॉन्फ़िगरेशन है।

मेरी समस्या यह है कि इन विकल्पों के साथ कॉन्फ़िगर करने के बाद, मैं देखता हूं कि यह क्रॉस कंपाइलर (x86_64-w64-mingw32-gcc) के बजाय मेरे सिस्टम के संकलक को आमंत्रित करता है। यदि मैं -xplatformविकल्प को छोड़ देता हूं और -platformअपने लक्ष्य कल्पना (linux-win32-g ++) पर सेट करता हूं, तो यह क्रॉस कंपाइलर को आमंत्रित करता है, लेकिन तब त्रुटि होती है जब यह पाता है कि कुछ यूनिक्स संबंधित फ़ंक्शन परिभाषित नहीं हैं।

यहाँ मेरे नवीनतम प्रयास से कुछ आउटपुट है: http://pastebin.com/QCpKSNev

प्रशन:

  1. जब लिनक्स होस्ट से विंडोज के लिए क्यूटी जैसी कुछ क्रॉस-कंपाइलिंग होती है, तो क्या देशी कंपाइलर को कभी इनवॉइस किया जाना चाहिए ? एक क्रॉस संकलन प्रक्रिया के दौरान, क्या हमें केवल क्रॉस कंपाइलर का उपयोग नहीं करना चाहिए ? जब मैं -xplatformविकल्प निर्दिष्ट करता हूं, तो मुझे नहीं दिखता कि क्यूटी की कॉन्फ़िगर स्क्रिप्ट मेरे सिस्टम के मूल संकलक को लागू करने की कोशिश क्यों करती है।

  2. अगर मैं mingw क्रॉस-कंपाइलर का उपयोग कर रहा हूं, तो मुझे ऐनक फाइल से कब निपटना होगा? जीसीसी के लिए विशेष फाइलें अभी भी मेरे लिए एक रहस्य की तरह हैं, इसलिए मैं सोच रहा हूं कि क्या यहां कुछ पृष्ठभूमि मेरी मदद करेगी।

  3. सामान्य तौर पर, मेरे qmake.conf में एक क्रॉस कंपाइलर निर्दिष्ट करने से परे, मुझे और क्या विचार करने की आवश्यकता हो सकती है?


2
मेरा मानना ​​है कि यह बाकी बिल्ड को बूटस्ट्रैप करने के लिए qmake के एक स्थानीय निर्माण की आवश्यकता है। stackoverflow.com/questions/1025687/… पर
मार्टिन बेकेट

ठीक है, यह समझ में आता है। मुझे अब बस एक और समस्या मिली, मैं देशी और पार टूलकिन्स को मिलाता हुआ प्रतीत होता हूं। मेरे पास्टबिन आउटपुट में त्रुटि x86_64-w64-mingw32-asमूल एक के बजाय कॉल करने के कारण प्रतीत होती है ।
श्री शुकदांस

2
मैं शायद ही कभी एक एसओ प्रश्न को पसंदीदा के रूप में चिह्नित करता हूं लेकिन यह एक अनूठा और दिलचस्प सवाल था।
jdi

जवाबों:


70

बस एम क्रॉस एनवायरनमेंट (एमएक्सई) का उपयोग करें । यह दर्द को पूरी प्रक्रिया से बाहर ले जाता है:

  • उसे ले लो:

    $ git clone https://github.com/mxe/mxe.git
    
  • बिल्ड निर्भरता स्थापित करें

  • Windows, उसकी निर्भरता और क्रॉस-बिल्ड टूल के लिए Qt बनाएँ; यह एक तेज़ मशीन पर लगभग एक घंटे लगेगा, जिसमें अच्छी इंटरनेट सुविधा होगी; डाउनलोड लगभग 500MB है:

    $ cd mxe && make qt
    
  • अपने एप्लिकेशन की निर्देशिका पर जाएं और PATH पर्यावरण चर में क्रॉस-बिल्ड टूल जोड़ें :

    $ export PATH=<mxe root>/usr/bin:$PATH
    
  • Qt मेकफाइल जेनरेटर टूल चलाएं फिर निर्माण करें:

    $ <mxe root>/usr/i686-pc-mingw32/qt/bin/qmake && make
    
  • आपको ./release निर्देशिका में बाइनरी ढूंढनी चाहिए:

    $ wine release/foo.exe
    

कुछ नोट :

  • एमएक्सई रिपॉजिटरी की मास्टर शाखा का उपयोग करें; यह विकास टीम से बहुत अधिक प्यार पाने के लिए प्रकट होता है।

  • आउटपुट 32-बिट स्टैटिक बाइनरी है, जो 64-बिट विंडोज पर अच्छा काम करेगा।


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
मार्टिन थोमा

17

(यह @ त्सेपांग के जवाब का अपडेट है, क्योंकि एमएक्सई उनके उत्तर के बाद से विकसित हुआ है)

भवन Qt

make qtक्यूटी बनाने के लिए उपयोग करने के बजाय , आप MXE_TARGETSअपनी लक्ष्य मशीन और टूलचिन (32- या 64-बिट) को नियंत्रित करने के लिए उपयोग कर सकते हैं । MXE ने लक्ष्य नाम के एक भाग के रूप में उपयोग करना शुरू कर दिया .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'

@ त्सेपंग के मूल उत्तर में, उन्होंने कोई निर्दिष्ट नहीं किया 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


अपडेट के लिए बहुत बहुत धन्यवाद। किसी को सीधे प्रोजेक्ट रिस्पांस पर काम करना भी अच्छा लगता है।
2:15 बजे tshepang

3
यह दूसरे उत्तर के लिए एक संपादन / अद्यतन होना चाहिए था, नया नहीं।
WhyNotHugo

3
@ ह्यूगो संपादित पृष्ठ कहता है: संपादित कैसे करें: at व्याकरणिक या वर्तनी की त्रुटियों को ठीक करें ► इसे बदलने के बिना अर्थ को स्पष्ट करें changing सही छोटी गलतियों को सुधारें resources संबंधित संसाधनों या लिंक को जोड़ें respect हमेशा मूल लेखक का सम्मान करें यह उनमें से कोई नहीं है। यह त्सेपांग के उत्तर का विस्तार है।
टिमोथी गुजरात

मुझे यह उत्तर समझ में नहीं आता, जब मैं "qt बनाते हैं ...." टाइप करता है, तो यह केवल 'लक्ष्य qt बनाने के लिए कोई नियम नहीं' के साथ प्रतिक्रिया करता है।
मेरा

5

लिनक्स पर विंडोज के लिए सॉफ्टवेयर को क्रॉस-कंपाइल करने का एक और तरीका आर्कलिनक्स पर मिनगॉ-डब्ल्यू 64 टूलचैन है। इसका उपयोग करना और बनाए रखना आसान है, और यह संकलक और कई पुस्तकालयों के हाल के संस्करण प्रदान करता है। मुझे व्यक्तिगत रूप से यह एमएक्सई की तुलना में आसान लगता है और यह पुस्तकालयों के नए संस्करणों को तेजी से अपनाने के लिए लगता है।

सबसे पहले, आपको एक कट्टर-आधारित मशीन (वर्चुअल मशीन या डॉकटर कंटेनर पर्याप्त होगा) की आवश्यकता होगी। यह आर्क लिनक्स होना जरूरी नहीं है, डेरिवेटिव भी करेगा। मैंने मंज़रो लिनक्स का इस्तेमाल किया। अधिकांश मिनगवॉ-डब्ल्यू 64 पैकेज आधिकारिक आर्क रिपॉजिटरी में उपलब्ध नहीं हैं, लेकिन AUR में बहुत कुछ है । आर्क (Pacman) के लिए डिफ़ॉल्ट पैकेज मैनेजर AUR से सीधे इंस्टॉलेशन का समर्थन नहीं करता है, इसलिए आपको AUR आवरण जैसे या याकोर्ट का उपयोग करना होगा। फिर QG5 और बूस्ट पुस्तकालयों के 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. डॉकटर कंटेनर शुरू करें:

    sudo docker रन -it burndaylight / mingw-arch: qt / bin / bash

  2. क्लोन और संकलन QNapi

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

बस! कई मामलों में, यह इतना आसान होगा। पैकेज रिपॉजिटरी (AUR) में अपने स्वयं के पुस्तकालयों को जोड़ना भी सीधा है। आपको PKBUILD फ़ाइल लिखने की आवश्यकता होगी , जो कि जितनी सहज हो, उतनी सहजता से देख सकते हैं, उदाहरण के लिए mingw-w64-Rapidjson देखें ।


तैनाती के लिए, आपको सभी आवश्यक Qt DLL (या doc.qt.io/qt-5/windows-deployment.html ) कॉपी करना होगा । सुनिश्चित करें कि /mingw64/share/qt5/plugins/platforms/qwindows.dll को प्लेटफार्मों / qwindows.dll में कॉपी किया जाएगा।
develCuy

4

ठीक है, मुझे लगता है कि मुझे पता चल गया है।

Https://github.com/mxe/mxe/blob/master/src/qt.mk और https://www.videolan.org/developers/vlc/contrib/src/qt4/usules.mak पर आधारित भाग में

ऐसा प्रतीत होता है कि "शुरू में" जब आप कॉन्फ़िगर (-xtarget, आदि) चलाते हैं, तो यह स्थानीय बाइनरी फ़ाइल बनाने के लिए आपके "होस्ट" gcc को चलाता है ।/bin/qmake।

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

फिर आप सामान्य "मेक" चलाते हैं और इसे मिंगव के लिए बनाता है

  make
  make install

इसलिए

  1. हाँ

  2. केवल अगर आपको msvcrt.dll (इसके डिफ़ॉल्ट) के अलावा कुछ का उपयोग करने की आवश्यकता है। हालाँकि मैंने कभी कुछ और इस्तेमाल नहीं किया है इसलिए मुझे कुछ पता नहीं है।

  3. https://stackoverflow.com/a/18792925/32453 कुछ कॉन्फ़िगर किए गए पार्म्स को सूचीबद्ध करता है।


4

Qt को संकलित करने के लिए, किसी को इसकी configureस्क्रिप्ट को चलाना होगा , होस्ट प्लेटफ़ॉर्म को निर्दिष्ट करना -platform(जैसे -platform linux-g++-64कि यदि आप जी ++ कंपाइलर के साथ 64-बिट लिनेक्स पर निर्माण कर रहे हैं) और लक्ष्य प्लेटफ़ॉर्म के साथ -xplatform(जैसे -xplatform win32-g++कि यदि आप विंडोज़ पर संकलन कर रहे हैं तो ) है।

मैंने इस ध्वज को भी जोड़ा है: -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- जो कि मैं उपयोग कर रहे टूलकिन के उपसर्ग को निर्दिष्ट करता हूं, जो विंडोज़ के लिए बायनेरिज़ बनाने वाले सभी मेकफाइल्स में 'जीसीसी' या 'जी ++' से पहले से तैयार हो जाएगा।

अंत में, आपको icd बनाते समय समस्याएँ आ सकती हैं , जो कि जाहिरा तौर पर एक ऐसी चीज है जिसका उपयोग ActiveX समर्थन को Qt में जोड़ने के लिए किया जाता है। आप -skip qtactiveqtकॉन्फ़िगर स्क्रिप्ट में ध्वज को पास करने से बच सकते हैं । मुझे इस बग रिपोर्ट से एक मिल गया है: https://bugreports.qt.io/browse/QTBUG_3833

यहाँ मैंने जो पूरी कॉन्फ़िगर कमांड प्रयोग की है:

    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 फ़ाइल में करने के बजाय कॉन्फ़िगर कमांड लाइन में क्रॉस कंपाइलर उपसर्ग निर्दिष्ट कर सकते हैं। और वहाँ भी है कि समस्या के साथ idc, जिसका समाधान मैं भी उल्लेख किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.