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

StackOverflow https://stackoverflow.com/questions/37398

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Спасибо.

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

Решение

Для времени выполнения C перейдите в настройки проекта, выберите C / C ++, затем «Генерация кода». Измените параметр «библиотека времени выполнения» на «многопоточный» вместо «многопоточный dll».

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

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

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

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

  • В разделе Свойства конфигурации - > C / C ++ - > Генерация кода, измените " Runtime Library " поле для "Многопоточного (/ 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.

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