Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

https://github.com/fancycode/MemoryModule

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top