Зависимости DLL для переносимого приложения C / C ++ для Windows - PullRequest
4 голосов
/ 14 июля 2011

Я хочу создать легкое портативное приложение на C / C ++ для Windows.Я не хочу статически связывать все, потому что я хочу, чтобы размер exe был как можно меньше.Я также использую Dependency Walker для отслеживания зависимостей DLL моего exe-файла.

Мой вопрос заключается в том, каковы список зависимостей DLL, которые может иметь приложение, иоставаться портативным в разных версиях Windows?Имея этот список под рукой, я могу проверить вывод из Dependency Walker со списком и выбрать, какие библиотеки статически связывать, а какие динамически связывать.Я предпочитаю, чтобы в списке были операционные системы от Windows XP и выше, но иметь в виду Windows 98 также интересно.

Ответы [ 3 ]

3 голосов
/ 14 июля 2011

Создайте базовое приложение Win32 в чем-то вроде Visual Studio и проверьте зависимости с помощью Dependency Walker. Это ваши основные зависимости. Потребуются все стандартные DLL-файлы Win32, включая user32.dll, kernel32.dll и т. Д. (Хотя некоторые из них различаются, в зависимости от того, что вы хотите, чтобы приложение делало. В некоторых случаях вы можете обойтись только с kernel32.dll, но вы не сможете отобразить окно на экране. Вероятно, довольно бесполезно приложение.)

Имейте в виду, что последней версией Visual Studio, которая может компилировать приложения, работающие в Windows 98, является Visual Studio 2005. Visual Studio 2008 может работать как минимум с Windows 2000, а VS 2010 - с Windows XP SP2. Вам нужно будет либо использовать более старую версию компилятора, либо вручную изменить заголовок PE исполняемого файла, чтобы изменить поле подсистемы.

Если вам действительно нравятся подобные вещи (хотя это, честно говоря, пустая трата времени), вам следует исследовать LIBCTINY Мэтта Петрека, первоначально из статьи , опубликованной в журнале MSDN в январе 2001 года. библиотека теоретически позволяет использовать флаг компилятора /NODEFAULTLIB , чтобы избежать связи с CRT.

2 голосов
/ 14 июля 2011

Если вы подключаетесь к стандартным библиотекам Windows, тогда проблем нет, поскольку библиотеки DLL уже есть в целевых системах.

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

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

Теперь, если вы обеспокоены связью со средой выполнения C, то вы можете рассмотреть возможность использования mingw, который может ссылаться на среду выполнения Windows C, которая присутствует во всех системах.

1 голос
/ 14 июля 2011

Я предполагаю, что вы используете VC. Microsoft предоставляет список, который вы ищете в MSDN. См:

Обратите внимание, что список меняется в зависимости от версии ВК (вы можете выбрать свою в верхней части страниц). Кроме того, в современных версиях Windows рекомендуется правильно установить исполняемые библиотеки DLL с помощью VCRedist _ *. Exe - это, вероятно, сделает ваши программы менее переносимыми, чем вы хотите, но это однократная установка ( В некотором роде) компоненты системы, которые никто никогда не должен будет удалять.

...