Как мне сделать полностью статически связанный .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.

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

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
119
0
137 229
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

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

Bill Forster 12.11.2008 05:55

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

Bill Forster 12.11.2008 05:57

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

Edward Strange 15.02.2011 02:35

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

Kiran M N 28.02.2013 18:07

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

Tomáš Zato - Reinstate Monica 06.05.2014 18:11

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

Gaspa79 28.08.2020 12:45

@EdwardStrange, что за проблемы?

jrh 15.09.2020 16:07

У меня была такая же проблема с зависимостями, и я также знаю, что вы можете включить библиотеки 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.

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

Kevin Condon 04.04.2013 20:49

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

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

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

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

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

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

gnovice 12.09.2018 23:30

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