Как сделать полностью статически связанную .exe с Visual Studio Express 2005?

Моя нынешняя предпочтительная среда С++ - это бесплатная и в значительной степени отличная версия Microsoft Visual Studio 2005 Express. Время от времени я отправлял выпуски .exe файлов другим людям с приятными результатами. Однако недавно я сделал тревожное открытие, что приятные результаты были основаны на большей удаче, которую я бы хотел. Попытка запустить одну из этих программ на старом (2001 год выпуска, но не скрупулезно обновленном) окне XP дала мне только неприятное сообщение "System not can not x.exe" (или подобное).

Некоторые поисковые запросы показали, что с помощью этого инструментария даже указание статической ссылки приводит к простому hello-world.exe, фактически полагающемуся на дополнительные DLL файлы (msvcm80.dll и т.д.). Невероятно сложная система инсталляции версии (файлы манифеста?) Тогда не позволит запускать .exe без правильных версий .dll. Я не хочу или не нуждаюсь в этом, я просто хочу, чтобы старомодный автономный .exe, который ничего не делает, кроме самых низких общих знаменательных операций Win32 и работает на любой старой ОС win32.

Кто-нибудь знает, может ли он делать то, что я хочу делать с существующим набором инструментов?

Спасибо.

Ответ 1

Для C-runtime перейдите к настройкам проекта, выберите C/С++, затем "Генерация кода". Измените параметр "библиотека времени выполнения" на "многопоточность" вместо "многопоточной DLL".

Если вы используете какие-либо другие библиотеки, вам может потребоваться сообщить компоновщику явно игнорировать динамически связанный CRT.

Ответ 2

У меня была такая же проблема с зависимостями, и я также знаю, что вы можете включить DLL VS 8.0 (релиз только! не отладка! --- и ваша программа также должна быть выпущена) в папке соответствующего имени, в родительской папке с вашим .exe:

Практическое руководство. Развертывание с использованием XCopy (MSDN)

Также обратите внимание, что в случае необходимости иметь код С++ и C в том же статически связанном файле .exe гарантируется, что вы получите конфликты компоновщика, которые могут быть решены только путем игнорирования правильного libXXX.lib, а затем динамического связывания (DLL).

Наконец, с помощью другого набора инструментов (VС++ 6.0) все "просто работает", так как в Windows 2000 и выше установлены правильные DLL файлы.

Ответ 3

Мой опыт работы с Visual Studio 2010 заключается в том, что для изменения DLL необходимы два изменения. На странице свойств проекта (щелкните правой кнопкой мыши по имени проекта в окне обозревателя решений):

  • В разделе "Свойства конфигурации" → "Общие" измените поле "Использование MFC" на "Использовать MFC в статической библиотеке".

  • В разделе "Свойства конфигурации" → "C/С++ → " Генерация кода "измените поле" Библиотека времени выполнения "на" Multi-Threaded (/MT) "

Не знаю, почему оба нужны. Я использовал это, чтобы удалить зависимость от glut32.dll.

Ответ 4

В отношении ответа Джареда, если Windows 2000 или лучше не обязательно исправить проблему. Ответ Rob работает, однако возможно, что это исправление представляет проблемы безопасности, поскольку обновления Windows не смогут исправлять приложения, созданные как таковые.

В другом посте Nick Guerrera предлагает упаковать Visual С++ Runtime, распространяемый с вашими приложениями, который быстро устанавливается и не зависит от Visual Studio.