2009-05-01 43 views
7

Tôi đang tạo một chương trình C++, nhưng tôi muốn chỉ có thể cung cấp một tệp .exe cho người dùng. Tuy nhiên, tôi đang sử dụng thư viện (curl trong số những người khác) trong đó có một số dll của. Có thể biên dịch các dll này vào tập tin exe.C++ Cách biên dịch dll trong một .exe

Tôi sử dụng Mã :: Khối và mingw.

+1

Xin lưu ý rằng cũng có thể có vấn đề về cấp phép liên quan. Ví dụ. một số giấy phép chỉ cho phép liên kết tĩnh nếu bạn cung cấp mã nguồn đầy đủ của chương trình. –

Trả lời

9

Để đạt được điều đó, bạn sẽ cần static linking. Điều này đòi hỏi rằng tất cả các thư viện của bạn (và các thư viện mà họ phụ thuộc theo đệ quy) cần phải có sẵn như là các thư viện tĩnh. Lưu ý rằng kích thước của tệp thực thi của bạn sẽ lớn, vì nó sẽ mang tất cả mã từ các thư viện tĩnh đó. Đây là lý do tại sao thư viện được chia sẻ (DLL) được phát minh ngay từ đầu, để có thể chia sẻ mã chung giữa các ứng dụng. Tuy nhiên, điều đó không phải lúc nào cũng hoạt động so well on windows.

Tôi nghĩ những gì bạn có thể thực sự muốn là một installer cài đặt tệp thực thi của bạn và tất cả thư viện phụ thuộc của nó.

+1

Tôi thích các thiết bị di động hầu hết thời gian, đặc biệt là cho các công cụ. Trình cài đặt làm lộn xộn trình đơn Start, màn hình nền và danh sách chương trình của tôi trong chương trình Add Remove.Đó là lý do tại sao tôi cringe mọi người mọi người đề nghị cài đặt cho loại câu hỏi. YMMV. Tuy nhiên, upvoted cho đoạn đầu tiên. – syaz

3

Bạn có thể sử dụng ILMerge

+0

Tôi nghĩ rằng ILMerge chỉ hoạt động với mã được quản lý chứ không phải mã gốc. – Ferruccio

+0

Điều đó đúng. Tôi giả định vì họ đang cố gắng đóng gói một dll họ đang làm việc trong .NET – Ichorus

+0

Nó cũng đúng là (một phương ngữ của Microsoft) C++ có thể được biên dịch sang IL. –

2

Bạn cần một số công cụ đóng gói đặc biệt như XBundler.

0

Nói chung, không. Dll có một số hành vi đặc biệt đó là không tầm thường, chẳng hạn như có được Loader Lock khi chúng được nạp và gọi DllMain tại những điểm đó. Trong khi một trình liên kết lý thuyết có thể sắp xếp cho mỗi DllMain được gọi từ ứng dụng main(), nó sẽ không xảy ra dưới Loaded Lock. Khóa Loader này nằm dưới sự kiểm soát của hệ điều hành. Ngoài ra, DLL được thông báo về các chủ đề mới thông qua DLLMain của họ, và điều này cũng sẽ gần như không thể giả mạo.

3

Tôi đã xem qua dll2lib tiện ích một lần. Thú vị mảnh, mặc dù đắt tiền nhất. Nó cho phép bạn chuyển đổi hầu như bất kỳ dll vào một thư viện tĩnh, mà sau này có thể được liên kết với ứng dụng của bạn để tạo ra exe rắn. IIRC, phiên bản miễn phí sẽ hiển thị thông báo nhất định (MessageBox) khi nhập một hàm từ thư viện được tạo như vậy.

4

Có một bài viết trong DDJ từ năm 2002 mà có thể có những gì bạn muốn:

Về cơ bản nó sử dụng một sự kết hợp của liên kết đến các DLL sử dụng MSVC của 'trì hoãn tải' tính năng và đóng gói DLL dưới dạng tài nguyên nhúng trong EXE. DLL sau đó sẽ tự động được trích xuất khi chạy khi lệnh gọi đầu tiên đến một trong các lần xuất được thực hiện.

Tôi đã không sử dụng kỹ thuật này vì vậy tôi không thể thực sự bình luận về cách nó hoạt động tốt, nhưng nó chắc chắn có vẻ như một ý tưởng khéo léo.

2

Nếu bạn thực sự cần phải thực hiện điều này, bạn có thể sử dụng thư viện tuyệt vời này sẽ cho phép bạn tải một DLL từ bộ nhớ. Tôi đã sử dụng nó để đọc một DLL từ một nguồn tài nguyên và tải nó cho tôi.

https://github.com/fancycode/MemoryModule

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