Как сделать полностью статически связанный .exe с Visual Studio Express 2005? - PullRequest
96 голосов
/ 01 сентября 2008

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

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

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

Спасибо.

Ответы [ 4 ]

113 голосов
/ 01 сентября 2008

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

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

11 голосов
/ 25 января 2016

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

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

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

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

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

4 голосов
/ 01 сентября 2008

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

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

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

Наконец, с другим набором инструментов (VC ++ 6.0) все «просто работает», поскольку в Windows 2000 и более поздних версиях установлены правильные библиотеки DLL.

1 голос
/ 06 июня 2011

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

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

...