Подтвердить что ты не робот

Скомпилировать программу на С++ только с зависимостями от kernel32.dll и user32.dll?

Я работаю с Visual Studio 2005.

Я хочу скомпилировать простую программу, которая будет работать с любой 32-разрядной версией Windows, независимо от установленной версии библиотеки времени выполнения С++.

Эта программа будет вызывать функции GetModuleHandle и GetProcAddress без каких-либо других вызовов функций, а затем выходить, когда код выхода является адресом функции.

Как скомпилировать С++-программу с только зависимостью от kernel32.dll и user32.dll, без какой-либо библиотеки времени выполнения С++?

4b9b3361

Ответ 1

Установите /NODEFAULTLIB в соответствии с вашими параметрами проекта. В новых версиях Visual С++ вам также придется отключать проверки, поскольку они заставляют компилятор автоматически вставлять вызовы в библиотечные функции.

EDIT: Если вы действительно имеете в виду "запустить на любой 32-разрядной версии Windows", вам также придется использовать editbin для изменения поля версии подсистемы в заголовке PE. В противном случае вы ограничены (IIRC) Windows 2000 и более поздними версиями при создании с помощью компоновщика VС++ 2005, а более новые версии VС++ еще хуже (по умолчанию требуется XP). Windows 2000 - 5.0, вы хотите указать 3.5 или около того, чтобы разрешить все версии NT в дополнение к Win9x.

Ответ 2

Вам нужно будет определить свою собственную точку входа вместо main или WinMain. Ваша точка входа является функцией void без аргументов. Вы должны указать его имя для компоновщика с /entry:funcName (где funcName заменяется любым именем, которое вы дали функции, которую хотите использовать в качестве точки входа).

Когда вы это сделаете, вам также нужно будет указать подсистему для компоновщика, как в /subsystem:console. Он обычно выводит подсистему на основе имени найденной функции (т.е. main → console, WinMain → Windows), но когда вы используете свою собственную точку входа, вы должны указать ее явно. Хотя вы, вероятно, не хотите очень часто, вы можете явно указать подсистему, даже если вы не укажете свою собственную точку входа, поэтому (например) вы можете использовать main в качестве точки входа в программу подсистемы Windows, или WinMain в качестве точки входа в консольную программу.

Ответ 3

Я не уверен, почему все советуют не использовать стандартную библиотеку. Этот метод предполагает, что вы хотите, чтобы ваш код работал в Windows 2000 или более поздней версии, и не против потери поддержки Win 9x. Вы все равно можете использовать стандартную библиотеку C/С++. Вы можете использовать опцию /MT на страницах проекта C/С++ Code Generation, которые будут связываться в стандартной библиотеке статически.

Однако две заметки, первая из меня: идея наличия динамически связанной стандартной библиотеки заключается в том, что любые ошибки в ней будут исправлены Windows Update (теоретически). Если вы свяжете библиотеку статически, вам необходимо перераспределить приложение для исправления ошибок в стандартной библиотеке. Поэтому не рекомендуется.

Во-вторых, из статьи MSDN в параметры компилятора:

Предостережение Не смешивайте статические и динамические версии времени выполнения библиотеки. Имея несколько копий библиотек времени выполнения в процессе может вызвать проблемы, поскольку статические данные в одной копии не распространяются на другая копия. Линкер предотвращает вы связываетесь как с статическими, так и с динамические версии в одном файле .exe, но вы все равно можете получить два (или больше) копии времени выполнения библиотеки. Например, динамическая ссылка библиотека, связанная со статическим (не DLL) версий времени выполнения библиотеки могут вызвать проблемы при использовании с файлом .exe, связанным с динамическая (DLL) версия библиотеки времени выполнения. (Вы также должны избежать смешивания отладки и отладки версии библиотек в одном Процесс.)

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

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

Изменить: результат в файле depend.exe выглядит следующим образом: (конечно, я использую 64-битную Windows, которая доступна только для XP и позже... если вы хотите знать, как это выглядит на 32-битных окнах, представьте, если 64 не было!).

depends.exe program showing only one dynamic dependency, kernel32.dll

Ответ 4

Проверьте крошечные c libs. Также статически ссылка.

Ответ 5

Вам также не нужен User32.dll, единственные, которые вы действительно не можете удалить, - это Kernel32.dll и Ntdll.dll - они вставляются в ваше пространство процесса с помощью PsCreateProcess (то есть, ядро, половина того, как ядро ​​создает новый процесс).