จะคอมไพล์สำหรับ Windows บน Linux ด้วย gcc / g ++ ได้อย่างไร


119

ฉันได้เขียนเอฟเฟกต์บางอย่างใน C ++ (g ++) โดยใช้ freeglut บน Linux และฉันรวบรวมด้วย

g++ -Wall -lglut part8.cpp -o part8

ดังนั้นฉันจึงสงสัยว่าเป็นไปได้หรือไม่ที่ g ++ จะสร้างไฟล์ปฏิบัติการ Windows ที่คอมไพล์แบบคงที่ซึ่งมีทุกอย่างที่จำเป็น?

ฉันไม่มี Windows ดังนั้นมันจะเจ๋งมากถ้าฉันทำได้บน Linux :)


4
@AndiDog "ให้ยาครั้งแรกฟรี" ใช่ไหม อย่างไรก็ตามการตั้งค่ากระบวนการสร้างอัตโนมัติบนเครื่อง Windows ในขณะที่คุณมีขั้นตอนที่สมบูรณ์และใช้งานได้สำหรับ Linux นั้นไม่จำเป็น
P Shved

คุณจะทดสอบซอฟต์แวร์ Windows โดยไม่มี Windows ได้อย่างไร ใช้ไวน์?
el.pescado

7
@ el.pescado การสร้างและการทดสอบเป็นงานที่แตกต่างกันอย่างสิ้นเชิง Windows ไม่จำเป็นสำหรับอดีต
P Shved

คำตอบ:


92

mingw32 มีอยู่เป็นแพ็คเกจสำหรับ Linux คุณสามารถคอมไพล์ข้ามและเชื่อมโยงแอปพลิเคชัน Windows ได้ มีการกวดวิชาที่เป็นที่นี่ที่ฟอรั่มรหัส :: บล็อก โปรดทราบว่าคำสั่งเปลี่ยนx86_64-w64-mingw32-gcc-win32เป็นเช่น

ตัวอย่างเช่น Ubuntu มี MinGW ในที่เก็บ:

$ apt-cache search mingw
[...]
g++-mingw-w64 - GNU C++ compiler for MinGW-w64
gcc-mingw-w64 - GNU C compiler for MinGW-w64
mingw-w64 - Development environment targeting 32- and 64-bit Windows
[...]

3
หากคุณใช้เดเบียน mingw32 จะอยู่ในที่เก็บแล้วพร้อมกับไลบรารีที่คอมไพล์ไว้ล่วงหน้าไม่กี่ไลบรารีด้วย
liori

1
ดีมีสภาพแวดล้อมที่ข้ามสะสมที่nongnu.org/mingw-cross-env ซึ่งรวมถึง freeglut เช่น แต่ฉันไม่ได้ใช้มันดังนั้นอย่าถามฉันเกี่ยวกับเรื่องนี้)
AndiDog

4
"32" ใน mingw32 หมายความว่าฉันสามารถสร้างไบนารี 32 บิตได้หรือไม่ มีวิธีการสร้างไบนารี 64 บิตด้วยหรือไม่?
bluenote10

1
bluenote10: มีตัวแปรที่สร้างสำหรับ x64 เช่น "x86_64-w64-mingw32-g ++" ฐาน "mingw32" อาจมีหรือไม่มีก็ได้ แต่ก็ง่ายพอที่จะติดตั้ง / ใช้ตัวแปรตามชื่อ ar2015: มันไม่รองรับ C ++ 11 เลยหรือคุณกำลังพูดถึงปัญหาที่คุณมีอยู่? ฉันกำลังดำเนินการเพื่อสร้างโครงการด้วย mingw ตามที่เราพูดและนี่เป็นข้อมูลที่ดีที่ควรทราบ เธรดอื่นระบุว่ารองรับ c ++ 11 (เช่นstackoverflow.com/questions/16136142/… ) แน่นอนฉันยินดีที่จะช่วยเหลือ แต่โพสต์แยกต่างหากจะดีที่สุดสำหรับสิ่งนั้น
John P

1
เมื่อเร็ว ๆ นี้มีการเปลี่ยนแปลงสิ่งต่างๆในหัวข้อนี้หรือไม่
มอนทรีออล

30

ทางเลือกหนึ่งของการคอมไพล์สำหรับ Windows ใน Linux คือผ่านทาง mingw ผมพบว่าการกวดวิชาที่เป็นประโยชน์มากที่นี่

ในการติดตั้ง mingw32 บนระบบที่ใช้ Debian ให้รันคำสั่งต่อไปนี้:
sudo apt-get install mingw32

ในการรวบรวมโค้ดของคุณคุณสามารถใช้สิ่งต่อไปนี้:
i586-mingw32msvc-g++ -o myApp.exe myApp.cpp

บางครั้งคุณอาจต้องการทดสอบแอปพลิเคชัน Windows ใหม่โดยตรงใน Linux คุณสามารถใช้ไวน์เพื่อทำสิ่งนั้นได้แม้ว่าคุณควรจำไว้เสมอว่าไวน์อาจมีข้อบกพร่อง ซึ่งหมายความว่าคุณอาจไม่แน่ใจว่ามีบั๊กอยู่ในไวน์โปรแกรมของคุณหรือทั้งสองอย่างดังนั้นให้ใช้ไวน์สำหรับการทดสอบทั่วไปเท่านั้น

ในการติดตั้งไวน์ให้เรียกใช้:
sudo apt-get install wine


7
คุณไม่จำเป็นต้องระบุmingw32-binutilsและmingw32-runtimeเนื่องจากเป็นที่พึ่งพาของmingw32
henje

เจ๋งมาก cpp มีข้อผิดพลาดง่ายมาก ( void main(){}ฯลฯ ... ) ฉันเดาว่ามันรวบรวมที่ windows แต่ล้มเหลวที่ mingw ฉันแก้ไขแล้ว ฉันลองi586-mingw32msvc-cppแล้วและมันสร้างไฟล์ข้อความที่มีบางอย่างเช่นสิ่งที่จะรวบรวม lol .. g ++ หนึ่งใช้งานได้ขอบคุณ
Aquarius Power

2
@henje ให้ละเอียดถ้าคุณไม่ระบุพวกเขาสามารถลบออกโดยอัตโนมัติโดยผู้จัดการแพคเกจเมื่อถอนการติดตั้งmingw32(ทำเครื่องหมายว่า "การอ้างอิง" ฉันคุณระบุพวกเขาพวกเขาจะไม่ (ทำเครื่องหมายว่า "ด้วยตนเอง")
Matthieu

19

วิธีที่แนะนำทำให้ฉันมีข้อผิดพลาดใน Ubuntu 16.04: E: ไม่พบแพ็คเกจ mingw32

================================================== =========================

ในการติดตั้งแพ็คเกจนี้บน Ubuntu โปรดใช้สิ่งต่อไปนี้:

sudo apt-get install mingw-w64

หลังจากติดตั้งคุณสามารถใช้งานได้:

x86_64-w64-mingw32-g++

โปรดทราบ!

สำหรับการใช้งาน 64 บิต: x86_64-w64-mingw32-g ++

สำหรับการใช้งาน 32 บิต: i686-w64-mingw32-g ++


14

ติดตั้ง cross compiler เช่น mingw64 จากตัวจัดการแพ็คเกจของคุณ จากนั้นรวบรวมในลักษณะต่อไปนี้: แทนที่จะโทรgccโทรi686-w64-mingw32-gccสำหรับ Windows 32 บิตหรือx86_64-w64-mingw32-gcc"64 บิต Windows ฉันจะใช้--staticตัวเลือกนี้ด้วยเนื่องจากระบบเป้าหมายอาจไม่มีไลบรารีทั้งหมด

หากคุณต้องการรวบรวมภาษาอื่นเช่น Fortran ให้แทนที่-gccด้วย-gfortranคำสั่งก่อนหน้า


7

ฉันใช้ mingw บน Linux เพื่อสร้างไฟล์ปฏิบัติการของ Windows ในภาษา C ฉันสงสัยว่า C ++ จะทำงานได้เช่นกัน

ฉันมีโปรเจ็กต์ ELLCC ที่แพ็กเกจเสียงดังและสิ่งอื่น ๆ เป็นโซ่เครื่องมือคอมไพเลอร์ข้าม ฉันใช้มันเพื่อรวบรวม clang (C ++), binutils และ GDB สำหรับ Windows ไปที่ลิงค์ดาวน์โหลดที่ellcc.orgสำหรับไบนารีที่คอมไพล์ไว้ล่วงหน้าสำหรับโฮสต์ Linux หลายตัว


1
ตั้งแต่ฉันโพสต์คำตอบนั้นฉันก็ไปไกลกว่านั้น ฉันมีโปรเจ็กต์ ELLCC ที่แพ็กเกจเสียงดังและสิ่งอื่น ๆ เป็นโซ่เครื่องมือคอมไพเลอร์ข้าม ฉันใช้มันเพื่อรวบรวม clang (C ++), binutils และ GDB สำหรับ Windows ไปที่ลิงค์ดาวน์โหลดที่ellcc.orgสำหรับไบนารีที่คอมไพล์ไว้ล่วงหน้าสำหรับโฮสต์ Linux หลายตัว
Richard Pennington

5

จาก: https://fedoraproject.org/wiki/MinGW/Tutorial

ตั้งแต่ Fedora 17 คุณสามารถสร้างไบนารี (cross-compile) สำหรับเป้าหมาย win32 และ win64 ได้อย่างง่ายดาย นี้จะตระหนักถึงการใช้ MinGW-w64 toolchain: http://mingw-w64.sf.net/ การใช้ toolchain นี้ช่วยให้คุณสร้างไบนารีสำหรับภาษาโปรแกรมต่อไปนี้: C, C ++, Objective-C, Objective-C ++ และ Fortran

"คำแนะนำและคำแนะนำสำหรับการใช้คอมไพเลอร์ข้าม Windows": https://fedoraproject.org/wiki/MinGW/Tips


3

สำหรับ Fedora มัน

sudo yum groupinstall -y "MinGW cross-compiler"

1
สำหรับผู้ใช้ Fedora ทุกคน: มีบทช่วยสอนที่ยอดเยี่ยมที่นี่: fedoraproject.org/wiki/MinGW (แก้ไขเนื่องจากลิงก์ผิด)
LemurPwned

สิ่งที่ฉันกำลังมองหา! ทำงานร่วมกับsudo dnf groupinstall ...เกินไป
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.