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

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

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

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

Спасибо.


person Bill Forster    schedule 01.09.2008    source источник


Ответы (4)


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

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

person Rob Walker    schedule 01.09.2008
comment
Если вы используете какие-либо другие библиотеки, вам может потребоваться указать компоновщику явно игнорировать динамически подключаемый CRT. Недавно столкнулся с этой проблемой. Я создавал приложение wxWidgets и обнаружил, что мне нужно перестроить библиотеки wxWidgets с той же модификацией генерации кода. - person Bill Forster; 12.11.2008
comment
Персонажей Man 300 немного. Если комментарий выше неясен, проблема в том, что и ваши файлы .cpp, и любые файлы библиотеки .cpp должны иметь «многопоточность» вместо «многопоточной dll», иначе вы можете получить ошибки связи. - person Bill Forster; 12.11.2008
comment
Это вызывает множество проблем, связанных с управлением кучей, с которыми вы, вероятно, не хотите иметь ничего общего. - person Edward Strange; 15.02.2011
comment
Для библиотек CRT VS предоставляет параметры / MD и / MT. Но как насчет статического связывания других библиотек в целом - скажем, libX.lib (это может быть моя собственная библиотека или сторонняя библиотека)? - person Kiran M N; 28.02.2013
comment
Я получаю error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'. Есть ли еще где-нибудь изменить тип сборки? Я создаю приложение wxWigets, очень похожее на @BillForster. Так что мне придется пересобрать wxWidgets? Как я могу это сделать? - person Tomáš Zato - Reinstate Monica; 06.05.2014
comment
@Rob Walker Если вы используете какие-либо другие библиотеки, вам может потребоваться указать компоновщику, чтобы он явно игнорировал динамически подключаемый CRT. Как нам это сделать - person Gaspa79; 28.08.2020
comment
@EdwardStrange, что за проблемы? - person jrh; 15.09.2020

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

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

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

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

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

person Sam Buss    schedule 24.01.2016
comment
Похоже, что это работает в Visual Studio 2013 с одним небольшим дополнением: мне пришлось изменить Свойства конфигурации - ›Общие -› Набор символов для использования набора символов Unicode. - person gnovice; 12.09.2018

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

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

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

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

person Jared Updike    schedule 01.09.2008

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

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

person bunkerdive    schedule 06.06.2011
comment
Хотя упаковка распространяемого пакета кажется предпочтительным решением, вам потребуются права администратора для запуска распространяемого установщика. Это не жизнеспособный вариант, если у вас есть пользователи, не являющиеся администраторами. - person Kevin Condon; 04.04.2013