Bagaimana cara mengkompilasi untuk Windows di Linux dengan gcc / g ++?

119

Saya telah menulis beberapa efek dalam C ++ (g ++) menggunakan freeglut di Linux, dan saya mengkompilasinya dengan

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

Jadi saya bertanya-tanya apakah mungkin untuk memiliki g ++ membuat executable Windows yang dikompilasi statis yang berisi semua yang dibutuhkan?

Saya tidak punya Windows, jadi akan sangat keren, jika saya bisa melakukannya di Linux :)

Louise
sumber
4
@AndiDog, "Dosis pertama gratis", benar. Bagaimanapun, menyiapkan proses build otomatis pada mesin Windows, sementara Anda memiliki yang sudah selesai dan berfungsi untuk Linux, tidak perlu.
P Shved
Bagaimana Anda menguji perangkat lunak Windows Anda tanpa Windows? Menggunakan Wine?
el.pescado
7
@ el.pescado, membangun dan menguji adalah tugas yang sama sekali berbeda. Windows tidak diperlukan untuk yang pertama.
P Shved

Jawaban:

92

mingw32 ada sebagai paket untuk Linux. Anda dapat mengkompilasi silang dan menautkan aplikasi Windows dengannya. Ada tutorial di sini di forum Code :: Blocks . Perhatikan bahwa perintah berubah menjadi x86_64-w64-mingw32-gcc-win32, misalnya.

Ubuntu, misalnya, memiliki MinGW di repositori:

$ 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
[...]
AndiDog
sumber
3
Jika Anda menggunakan debian, mingw32 sudah ada di repositori, bersama dengan beberapa pustaka prakompilasi juga.
liori
1
Ada lingkungan kompilasi silang di nongnu.org/mingw-cross-env . Ini termasuk freeglut, misalnya. Tapi saya belum pernah menggunakan ini, jadi jangan tanya saya tentang itu;)
AndiDog
4
Apakah "32" di mingw32 berarti saya hanya dapat menghasilkan biner 32-bit? Apakah ada solusi untuk menghasilkan biner 64-bit juga?
bluenote10
1
bluenote10: ada varian yang dibuat untuk x64, seperti "x86_64-w64-mingw32-g ++". Basis "mingw32" mungkin atau mungkin tidak mampu, tapi cukup mudah untuk menginstal / menggunakan varian berdasarkan nama. ar2015: Apakah itu sama sekali tidak mendukung C ++ 11 atau Anda berbicara tentang masalah yang Anda alami dengannya? Saya sedang mengerjakan sebuah proyek untuk dibangun dengan mingw saat kita berbicara dan ini akan menjadi informasi yang baik untuk diketahui. Utas lain menunjukkan bahwa ia mendukung c ++ 11 (misalnya stackoverflow.com/questions/16136142/… ). Tentu saja saya akan dengan senang hati membantu, tetapi posting terpisah akan menjadi yang terbaik untuk itu.
John P
1
Apakah hal-hal tentang topik ini berubah baru-baru ini?
Montreal
30

Salah satu pilihan kompilasi untuk Windows di Linux adalah melalui mingw. Saya menemukan tutorial yang sangat membantu di sini .

Untuk menginstal mingw32 pada sistem berbasis Debian, jalankan perintah berikut:
sudo apt-get install mingw32

Untuk mengompilasi kode Anda, Anda dapat menggunakan sesuatu seperti:
i586-mingw32msvc-g++ -o myApp.exe myApp.cpp

Terkadang Anda ingin menguji aplikasi Windows baru langsung di Linux. Anda dapat menggunakan anggur untuk itu, meskipun Anda harus selalu ingat bahwa anggur dapat mengandung serangga. Ini berarti Anda mungkin tidak yakin bahwa ada bug di wine, program Anda, atau keduanya, jadi gunakan wine untuk pengujian umum saja.

Untuk memasang wine, jalankan:
sudo apt-get install wine

aggregate1166877
sumber
7
Anda tidak perlu menentukan mingw32-binutilsdan mingw32-runtimekarena itu adalah dependensi darimingw32
henje
keren, cpp memiliki kesalahan yang sangat sederhana ( void main(){}dll ...), saya kira itu mengkompilasi di windows tetapi gagal di mingw, saya memperbaikinya. Saya juga mencoba i586-mingw32msvc-cppdan menghasilkan file teks dengan sesuatu seperti hal-hal yang akan dikompilasi lol .. g ++ yang berfungsi, terima kasih!
Aquarius Power
2
@henje agar teliti, jika Anda tidak menentukannya, mereka dapat dihapus secara otomatis oleh manajer paket saat menghapus instalasi mingw32(ditandai sebagai "dependensi". Jika Anda menentukannya, mereka tidak akan melakukannya (ditandai sebagai "manual").
Matthieu
19

Metode yang disarankan memberi saya kesalahan pada Ubuntu 16.04: E: Tidak dapat menemukan paket mingw32

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

Untuk menginstal paket ini di Ubuntu, gunakan yang berikut:

sudo apt-get install mingw-w64

Setelah menginstal, Anda dapat menggunakannya:

x86_64-w64-mingw32-g++

Tolong dicatat!

Untuk penggunaan 64-bit: x86_64-w64-mingw32-g ++

Untuk penggunaan 32-bit: i686-w64-mingw32-g ++

0x8BADF00D
sumber
14

Instal kompiler silang, seperti mingw64 dari manajer paket Anda. Kemudian kompilasi dengan cara berikut: daripada hanya memanggil gccpanggilan i686-w64-mingw32-gccuntuk Windows 32-bit atau x86_64-w64-mingw32-gcc"untuk Windows 64-bit. Saya juga akan menggunakan --staticopsi, karena sistem target mungkin tidak memiliki semua perpustakaan.

Jika Anda ingin mengkompilasi bahasa lain, seperti Fortran, ganti -gccdengan -gfortrandi perintah sebelumnya.

Pedro Miranda
sumber
7

Saya telah menggunakan mingw di Linux untuk membuat Windows dapat dieksekusi di C, saya curiga C ++ akan berfungsi juga.

Saya memiliki proyek, ELLCC, yang mengemas dentang dan hal-hal lain sebagai rantai alat kompilator silang. Saya menggunakannya untuk mengkompilasi clang (C ++), binutils, dan GDB untuk Windows. Ikuti tautan unduhan di ellcc.org untuk binari yang telah dikompilasi sebelumnya untuk beberapa host Linux.

Richard Pennington
sumber
1
Sejak saya memposting jawaban itu, saya telah melangkah lebih jauh. Saya memiliki proyek, ELLCC, yang mengemas dentang dan hal-hal lain sebagai rantai alat kompilator silang. Saya menggunakannya untuk mengkompilasi clang (C ++), binutils, dan GDB untuk Windows. Ikuti tautan unduhan di ellcc.org untuk binari yang telah dikompilasi sebelumnya untuk beberapa host Linux.
Richard Pennington
5

Dari: https://fedoraproject.org/wiki/MinGW/Tutorial

Mulai Fedora 17, dimungkinkan untuk dengan mudah membangun (kompilasi silang) binari untuk target win32 dan win64. Ini direalisasikan dengan menggunakan toolchain mingw-w64: http://mingw-w64.sf.net/ . Menggunakan toolchain ini memungkinkan Anda membuat biner untuk bahasa pemrograman berikut: C, C ++, Objective-C, Objective-C ++ dan Fortran.

"Kiat dan trik untuk menggunakan kompiler silang Windows": https://fedoraproject.org/wiki/MinGW/Tips

iljau
sumber
3

untuk Fedora itu

sudo yum groupinstall -y "MinGW cross-compiler"
pemulung
sumber
1
Untuk semua pengguna Fedora itu: ada tutorial hebat di sini: fedoraproject.org/wiki/MinGW (diedit karena tautan salah)
LemurPwned
Persis apa yang saya cari! Bekerja dengan sudo dnf groupinstall ...juga.