2010-09-03 35 views
8

Tôi muốn tạo một exe độc ​​lập với Cygwin. Tôi có hai lựa chọn:Biên dịch độc lập với Cygwin

  1. staticly liên kết cygwin1.dll
    Nếu tôi có thể liên kết tĩnh cygwin1.dll, sau đó tôi có thể nhận được một exe độc ​​lập.

  2. Hợp nhất cygwin1.dll với myprog.exe
    Nếu tôi có thể hợp nhất cygwin1.dll với chương trình của mình, tôi có thể có một exe độc ​​lập.

Không đề nghị tôi sử dụng IlMerge. Điều này sẽ không làm việc vì tôi không biên dịch chương trình của tôi với .NET.

Có thể chọn bất kỳ tùy chọn nào sau đây không? Nếu không, liệu có điều gì có thể xảy ra với tình trạng tiến thoái lưỡng nan này? Thanx!

+0

Tôi nhận rằng bạn thực sự yêu cầu dịch vụ từ CYGWIN.DLL và chỉ sử dụng -Mno-cygwin (hoặc MinGW) sẽ không hoạt động đối với bạn? – RBerteig

+0

Tôi không biết. Tôi đang sử dụng GCJ, nhưng tôi không thể nhận được GCJ mà đi kèm với mingw để làm việc. –

Trả lời

3

Tôi có thể thấy hai khả năng mà bạn có thể xem xét hợp lý. Có thể xây dựng một tệp thực thi với trình biên dịch khác (ví dụ: MinGW - bất kỳ thứ gì, chỉ cần không cần cygwin) để giải nén tệp thực thi chính và cygwin.dll vào thư mục tạm thời và sau đó sinh ra tệp thực thi đó. Để chỉ phân phối một tệp thực thi duy nhất, bạn muốn thêm tệp thực thi chính và cygwin.dll vào "stub" làm tài nguyên nhị phân. Đó là một chút xấu xí, nhưng khá đơn giản.

Cách khác là lấy source to cygwin và xây dựng nó làm thư viện tĩnh. Ít nhất về mặt lý thuyết, điều này phải sạch hơn - nhưng nó cũng chắc chắn là có nhiều công việc hơn. Bắt nó để xây dựng như là mã hoàn toàn tĩnh thay vì một DLL gần như chắc chắn sẽ mất một số công việc, mặc dù thật khó để đoán được bao nhiêu. Chỉ cần duyệt một chút, có vẻ như không chắc rằng nó sẽ là một công việc nhanh chóng trong vài giờ, hoặc bất cứ thứ gì như thế (trừ khi có điều gì đó mà tôi bỏ lỡ đã hỗ trợ xây dựng nó tĩnh, tất nhiên).

3

Hãy thử truyền -mno-cygwin làm cờ trình biên dịch và liên kết. Nếu yêu cầu của chương trình của bạn đủ đơn giản, điều này sẽ tránh tùy thuộc vào thư viện Cygwin và tạo một EXE độc lập.

+1

Các bài viết khác đã chỉ ra rằng điều này không hoạt động nữa, vì lợi ích của người đọc gần đây hơn. Tính năng hiện không còn được dùng nữa. – eewanco

1

Câu trả lời chính xác hơn về Jerry.

Quy trình được mô tả bên dưới phải đối mặt với quyền và luật giấy phép của bạn! Tôi biết nó có thể làm việc nhưng quyền phân phối kết quả (hoặc thậm chí thực hiện các thủ tục) có thể được (và tôi thực sự cảm thấy được) bị ràng buộc bởi giấy phép Cygwin. Đó là bởi vì ứng dụng của bạn vẫn sẽ tham khảo Cygwin (mặc dù nó là vô ích - nhưng vẫn còn trong ứng dụng của bạn)

Giả hello.exe là tên của ứng dụng tuyệt vời của bạn biên soạn dưới Cygwin trong thư mục dự án lớn C:\xxx\yyy\zzz\

Trong giao diện điều khiển cygwin truy cập C:\xxx\yyy\zzz và nhập

objdump -p hello.exe | grep "DLL Name" 

Bạn nhận được tất cả các tệp DLL mà ứng dụng của bạn sử dụng. Sau đó sao chép C:\xxx\yyy\zzz vào tất cả các tệp DLL được liệt kê và cụ thể cho Cygwin.

Lưu ý rằng ứng dụng của bạn có thể gọi các ứng dụng khác (sử dụng hàm exec) --- tìm thư viện aplications sử dụng và sao chép thư viện này cũng như các ứng dụng này - C:\xxx\yyy\zzz.

Có thể bạn sẽ phải biên dịch lại dự án của mình bằng tùy chọn loại -L C:\xxx\yyy\zzz hoặc hơn.Xem tất cả các đường dẫn khác trong nguồn của bạn.

Vì vậy, ứng dụng của bạn trở nên độc lập với cài đặt Cygwin và bạn có thể trình bày chức năng của nó với/chia sẻ nó với ---- người dùng Windows khác không có Cygwin. Nhưng - một lần nữa tôi chỉ ra và hỏi bạn - hãy nhận biết giấy phép và luật pháp hợp pháp của những người sáng tạo Cygwin và quan sát họ!

Các vấn đề liên quan