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


109

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

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

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

Спасибо.

Ответы:


127

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

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


«Если вы используете какие-либо другие библиотеки, вам может потребоваться указать компоновщику, чтобы он явно игнорировал динамически подключаемый CRT». Недавно столкнулся с этой проблемой. Я создавал приложение wxWidgets и обнаружил, что мне нужно перестроить библиотеки wxWidgets с той же модификацией генерации кода,
Билл Форстер,

6
Персонажей Man 300 немного. Если комментарий выше неясен, проблема в том, что и ваши файлы .cpp, и любые файлы библиотеки .cpp должны иметь «многопоточную» вместо «многопоточной dll», иначе вы можете получить ошибки связи.
Билл Форстер

Это вызывает множество проблем, связанных с управлением кучей, с которыми вы, вероятно, не хотите иметь ничего общего.
Эдвард Стрэндж,

Для библиотек CRT VS предоставляет параметры / MD и / MT. Но как насчет статического связывания других библиотек вообще - скажем, libX.lib (это может быть моя собственная библиотека или сторонняя библиотека)?
Kiran MN

4
Я понимаю error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'. Есть ли еще где-нибудь изменить тип сборки? Я создаю приложение wxWigets, очень похожее на @BillForster. Так что мне придется перестраивать wxWidgets? Как я могу это сделать?
Томаш Зато - Восстановите Монику

19

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

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

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

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

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


1
Кажется, это работает в Visual Studio 2013 с одним небольшим дополнением: мне пришлось изменить Свойства конфигурации -> Общие -> Набор символов на «Использовать набор символов Юникода».
gnovice

4

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

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

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

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


1

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

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


2
Хотя упаковка распространяемого пакета кажется предпочтительным решением, вам нужны права администратора для запуска распространяемого установщика. Это не жизнеспособный вариант, если у вас есть пользователи, не являющиеся администраторами.
Кевин Кондон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.