C ++ Как скомпилировать dll в .exe - PullRequest
7 голосов
/ 01 мая 2009

Я создаю программу на С ++, но хочу иметь возможность предложить пользователю только файл .exe. Тем не менее, я использую библиотеки (curl среди других), которые имеют некоторые DLL. Можно ли скомпилировать эти DLL в файл .exe?

Я использую Code :: Blocks и mingw.

Ответы [ 7 ]

10 голосов
/ 01 мая 2009

Для этого вам понадобится статическое связывание . Это требует, чтобы все ваши библиотеки (и библиотеки, от которых они зависят рекурсивно) должны быть доступны как статические библиотеки. Имейте в виду, что размер вашего исполняемого файла будет большим, поскольку он будет нести весь код из этих статических библиотек. Вот почему общие библиотеки (DLL) были изобретены в первую очередь, чтобы иметь возможность совместно использовать общий код между приложениями. Однако это не всегда хорошо работает в Windows .

Я думаю, что вам действительно может понадобиться установщик , который устанавливает ваш исполняемый файл и все его зависимые библиотеки.

4 голосов
/ 01 мая 2009

Есть статья в DDJ от 2002 года, которая может иметь то, что вы хотите:

В основном он использует комбинацию связывания с библиотекой DLL с использованием функции MSVC «отложенная загрузка» и упаковывает библиотеку DLL как встроенный ресурс в EXE. Затем DLL автоматически извлекается во время выполнения при первом вызове одного из экспортов.

Я не использовал эту технику, поэтому я не могу прокомментировать, насколько хорошо она работает, но она, похоже, выглядит изящной идеей.

3 голосов
/ 01 мая 2009

Я однажды сталкивался с утилитой dll2lib . Интересная штука, хоть и дорогая. Это позволяет вам конвертировать практически любую dll в статическую библиотеку, которая впоследствии может быть связана с вашим приложением для создания твердого exe. IIRC, бесплатная версия будет отображать определенные уведомления (MessageBox) при входе в функцию из такой сгенерированной библиотеки.

3 голосов
/ 01 мая 2009

Вы можете использовать ILMerge

2 голосов
/ 17 декабря 2012

Если вам действительно нужно это сделать, вы можете использовать эту замечательную библиотеку, которая позволит вам загружать DLL из памяти. Я использовал его для чтения DLL из ресурса и загрузки для меня.

https://github.com/fancycode/MemoryModule

2 голосов
/ 01 мая 2009

Вам понадобятся специальные упаковочные инструменты, такие как XBundler .

0 голосов
/ 01 мая 2009

В общем, нет. Библиотеки DLL имеют несколько необычное поведение, такое как получение Loader Lock при загрузке и вызов DllMain в этих точках. Хотя теоретический компоновщик может организовать вызов каждого DllMain из приложения main (), этого не произойдет при Loaded Lock. Эта блокировка загрузчика находится под контролем ОС. Кроме того, библиотеки DLL уведомляются о новых потоках через свою библиотеку DLLMain, и это тоже почти невозможно подделать.

...