Làm thế nào để biên dịch cho Windows trên Linux với gcc / g ++?


119

Tôi đã viết một số hiệu ứng trong C ++ (g ++) bằng cách sử dụng freeglut trên Linux và tôi biên dịch chúng bằng

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

Vì vậy, tôi đã tự hỏi liệu g ++ có thể tạo các tệp thực thi Windows được biên dịch tĩnh chứa mọi thứ cần thiết không?

Tôi không có Windows, vì vậy nó sẽ thực sự tuyệt vời, nếu tôi có thể làm điều đó trên Linux :)


4
@AndiDog, "Liều đầu tiên miễn phí", đúng. Dù sao, việc thiết lập quy trình xây dựng tự động trên máy Windows, trong khi bạn có một quy trình hoàn chỉnh và đang hoạt động cho Linux, là không cần thiết.
P Shved

Bạn sẽ kiểm tra phần mềm Windows của mình như thế nào khi không có Windows? Dùng rượu?
el.pescado

7
@ el.pescado, xây dựng và thử nghiệm là những nhiệm vụ hoàn toàn khác nhau. Windows là không cần thiết đối với trước đây.
P Shved

Câu trả lời:


92

mingw32 tồn tại dưới dạng một gói dành cho Linux. Bạn có thể biên dịch chéo và liên kết các ứng dụng Windows với nó. Có một hướng dẫn ở đây tại diễn đàn Code :: Blocks . Hãy nhớ rằng lệnh thay đổi thành x86_64-w64-mingw32-gcc-win32chẳng hạn.

Ubuntu, ví dụ, có MinGW trong kho của nó:

$ 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
Nếu bạn sử dụng debian, mingw32 đã có trong kho lưu trữ, cùng với một số thư viện được biên dịch sẵn.
liori

1
Chà, có một môi trường tổng hợp chéo tại nongnu.org/mingw-cross-env . Nó bao gồm freeglut, chẳng hạn. Nhưng tôi đã không sử dụng này, vì vậy đừng hỏi tôi về điều đó;)
AndiDog

4
Có phải "32" trong mingw32 có nghĩa là tôi chỉ có thể tạo ra một nhị phân 32 bit không? Có giải pháp nào để tạo ra một nhị phân 64-bit không?
bluenote10

1
bluenote10: có các biến thể xây dựng cho x64, chẳng hạn như "x86_64-w64-mingw32-g ++". Cơ sở "mingw32" có thể có hoặc không, nhưng nó đủ dễ dàng để cài đặt / sử dụng các biến thể theo tên. ar2015: Nó không hỗ trợ C ++ 11 hay bạn đang nói về vấn đề bạn gặp phải với nó? Tôi đang làm việc để thực hiện một dự án để xây dựng với mingw khi chúng tôi nói chuyện và đây sẽ là thông tin tốt để biết. Các chủ đề khác chỉ ra rằng nó hỗ trợ c ++ 11 (ví dụ: stackoverflow.com/questions/16136142/… ). Tất nhiên tôi rất sẵn lòng giúp đỡ, nhưng một bài đăng riêng biệt sẽ là tốt nhất cho điều đó.
John P

1
Những thứ về chủ đề này có thay đổi gần đây không?
Montreal

30

Một tùy chọn biên dịch cho Windows trong Linux là thông qua mingw. Tôi tìm thấy một hướng dẫn rất hữu ích ở đây .

Để cài đặt mingw32 trên hệ thống dựa trên Debian, hãy chạy lệnh sau:
sudo apt-get install mingw32

Để biên dịch mã của bạn, bạn có thể sử dụng một số thứ như:
i586-mingw32msvc-g++ -o myApp.exe myApp.cpp

Đôi khi bạn sẽ muốn kiểm tra ứng dụng Windows mới trực tiếp trong Linux. Bạn có thể sử dụng rượu vang để làm điều đó, mặc dù bạn phải luôn nhớ rằng rượu vang có thể có sâu bọ. Điều này có nghĩa là bạn có thể không chắc chắn rằng lỗi nằm trong wine, chương trình của bạn hoặc cả hai, vì vậy chỉ sử dụng wine để kiểm tra chung.

Để cài đặt wine, hãy chạy:
sudo apt-get install wine


7
bạn không cần phải xác định mingw32-binutilsmingw32-runtimevì họ là phụ thuộc củamingw32
henje

tuyệt, cpp có những lỗi rất đơn giản ( void main(){}vv ...), tôi đoán nó biên dịch trên windows nhưng không thành công ở mingw, tôi đã sửa chúng. Tôi cũng đã thử i586-mingw32msvc-cppvà nó đã tạo ra một tệp văn bản với những thứ giống như những thứ cần được biên dịch lol .. tệp g ++ đã hoạt động, thx!
Aquarius Power

2
@henje nói thật kỹ, nếu bạn không chỉ định chúng, trình quản lý gói có thể tự động xóa chúng khi gỡ cài đặt mingw32(được đánh dấu là "phụ thuộc". Tôi bạn chỉ định chúng, chúng sẽ không (được đánh dấu là "thủ công")).
Matthieu

19

Phương pháp được đề xuất đã gây ra lỗi cho tôi trên Ubuntu 16.04: E: Không thể định vị gói mingw32

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

Để cài đặt gói này trên Ubuntu, vui lòng sử dụng sau:

sudo apt-get install mingw-w64

Sau khi cài đặt, bạn có thể sử dụng nó:

x86_64-w64-mingw32-g++

Xin lưu ý!

Để sử dụng 64-bit: x86_64-w64-mingw32-g ++

Để sử dụng 32-bit: i686-w64-mingw32-g ++


14

Cài đặt một trình biên dịch chéo, như mingw64 từ trình quản lý gói của bạn. Sau đó biên dịch theo cách sau: thay vì chỉ gọi gcclệnh call i686-w64-mingw32-gcccho Windows 32 bit hoặc x86_64-w64-mingw32-gcc"cho Windows 64 bit. Tôi cũng sẽ sử dụng --statictùy chọn này, vì hệ thống đích có thể không có tất cả các thư viện.

Nếu bạn muốn biên dịch ngôn ngữ khác, như Fortran, hãy thay thế -gccbằng -gfortrantrong các lệnh trước đó.


7

Tôi đã sử dụng mingw trên Linux để tạo các tệp thực thi Windows bằng C, tôi nghi ngờ C ++ cũng sẽ hoạt động.

Tôi có một dự án, ELLCC, gói clang và những thứ khác dưới dạng một chuỗi công cụ biên dịch chéo. Tôi sử dụng nó để biên dịch clang (C ++), binutils và GDB cho Windows. Theo liên kết tải xuống tại ellcc.org để biết các tệp nhị phân được biên dịch trước cho một số máy chủ Linux.


1
Kể từ khi tôi đăng câu trả lời đó, tôi đã đi xa hơn một chút. Tôi có một dự án, ELLCC, gói clang và những thứ khác dưới dạng một chuỗi công cụ biên dịch chéo. Tôi sử dụng nó để biên dịch clang (C ++), binutils và GDB cho Windows. Theo liên kết tải xuống tại ellcc.org để biết các tệp nhị phân được biên dịch trước cho một số máy chủ Linux.
Richard Pennington

5

Từ: https://fedoraproject.org/wiki/MinGW/Tutorial

Kể từ Fedora 17, có thể dễ dàng tạo các tệp nhị phân (biên dịch chéo) cho các mục tiêu win32 và win64. Điều này được thực hiện bằng chuỗi công cụ mingw-w64: http://mingw-w64.sf.net/ . Sử dụng chuỗi công cụ này cho phép bạn tạo mã nhị phân cho các ngôn ngữ lập trình sau: C, C ++, Objective-C, Objective-C ++ và Fortran.

"Mẹo và thủ thuật sử dụng trình biên dịch chéo của Windows": https://fedoraproject.org/wiki/MinGW/Tips


3

đối với Fedora nó là

sudo yum groupinstall -y "MinGW cross-compiler"

1
Đối với tất cả những người dùng Fedora đó: có một hướng dẫn tuyệt vời ở đây: fedoraproject.org/wiki/MinGW (đã chỉnh sửa vì liên kết sai)
LemurPwned

Chính xác những gì tôi đang tìm kiếm! Hoạt động với sudo dnf groupinstall ...quá.
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.