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


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

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

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

спасибо.

4 87

4 ответа:

для C-runtime перейдите в настройки проекта, выберите C / C++, затем "генерация кода". Менять рантайм библиотеки' настройка 'многопоточный' вместо 'многопоточных dll файлы'.

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

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

  1. свойства конфигурации - > общие, изменить "использование полевых МФЦ" "использовать MFC в статической библиотеке".

  2. В разделе свойства конфигурации --> C / C++ --> генерация кода измените поле "библиотека времени выполнения" на " многопоточная (/MT)"

Не уверен, почему оба были необходимы. Я использовал это, чтобы удалить зависимость от glut32.файл DLL.

добавлено позже: при внесении этих изменений в конфигурации, вы должны сделать их "все конфигурации" --- вы можете выбрать это в верхней части окна свойств. Если вы измените только конфигурацию отладки, она не будет применяться к конфигурации выпуска и наоборот.

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

как: развертывание с помощью XCopy (MSDN)

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

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

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

в другом сообщении Ник Геррера предлагает упаковывать распространяемый компонент среды выполнения Visual C++ с вашими приложениями, который быстро устанавливается и не зависит от Visual Studio.