Як зробити повністю статично пов'язаний .exe з Visual Studio Express 2005?


109

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

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

Хтось знає, чи можливо зробити те, що я хочу зробити зі своїм наявним набором інструментів?

Дякую.

Відповіді:


126

Щоб C-час виконання перейшов до налаштувань проекту, виберіть C / C ++, а потім "Генерація коду". Змініть налаштування 'бібліотека часу виконання' на 'багатопотокове' замість 'багатопотокового dll'.

Якщо ви використовуєте будь-які інші бібліотеки, можливо, вам доведеться сказати лінкеру явно ігнорувати динамічно пов'язаний CRT.


"Якщо ви використовуєте будь-які інші бібліотеки, вам може знадобитися сказати лінкеру явно ігнорувати динамічно пов'язану CRT." Нещодавно я зіткнувся з цим питанням. Я будував додаток wxWidgets, я виявив, що мені потрібно відновити контури wxWidgets з тією ж модифікацією генерації коду
Білл Форстер

6
Людина 300 символів - не багато. Якщо вищевказаний коментар є незрозумілим, проблема полягає в тому, що і ваші .cpp-файли, і будь-які бібліотечні файли .cpp повинні мати "багатопотоковість" замість "багатопотокового dll", інакше ви можете отримати помилки посилання.
Білл Форстер

Це вводить численні проблеми щодо керування купою, з якими ви, мабуть, не хочете нічого спільного.
Едвард Странд

Для бібліотек CRT VS надає параметри / MD & / MT. А як щодо того, щоб взагалі статично зв’язувати інші бібліотеки - скажімо, libX.lib (яка могла бути моєю власною бібліотекою чи бібліотекою сторонніх розробників)?
Кіран МН

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

18

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

  1. У розділі Властивості конфігурації -> Загальне змініть поле "Використання MFC" на "Використовувати MFC у статичній бібліотеці".

  2. У розділі Властивості конфігурації -> C / C ++ -> Генерація коду змініть поле "Бібліотека виконання" на "Багатопотокове (/ MT)"

Не впевнений, навіщо потрібні обоє. Я використовував це для усунення залежності від glut32.dll.

Додано пізніше: Коли ви вносите ці зміни в конфігурації, вам слід внести їх у "Усі конфігурації" --- ви можете вибрати це у верхній частині вікна Властивості. Якщо ви внесете зміни до конфігурації налагодження, вона не застосовуватиметься до конфігурації випуску, і навпаки.


1
Здається, це працює в Visual Studio 2013 з одним невеликим доповненням: мені довелося змінити властивості конфігурації -> загальне -> набір символів на "використовувати набір символів Unicode".
gnovice

4

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

Як: розгортати за допомогою XCopy (MSDN)

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

Нарешті, з іншим набором інструментів (VC ++ 6.0) речі "просто працюють", оскільки в Windows 2000 і вище встановлені правильні DLL-файли.


1

Що стосується відповіді Джареда, наявність Windows 2000 або вище не обов'язково виправить це питання. Відповідь Роба справді працює, однак можливо, що це виправлення введе проблеми безпеки, оскільки оновлення Windows не зможуть виправити додатки, створені як такі.

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


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