Как я могу скомпилировать код C ++ в независимый исполняемый файл Windows?

1239
aswine

У меня есть программа на C ++, которую я могу скомпилировать и запустить на Mac OS 10.11 с помощью g ++. Я также смог скомпилировать и запустить его на Windows 10 с помощью Visual Studio. Однако, когда я попытался запустить файл .exe на компьютере с Windows 10, на котором не была установлена ​​Visual Studio, Windows пожаловалась, что несколько файлов .dll не существует.

Я хотел бы иметь возможность запускать эту программу на компьютерах Windows, не требуя никакой установки чего-либо. Программа очень проста, состоит из одного файла .cpp и живет только в текстовом терминале. Все, что он делает, это запрашивает ввод, отображает некоторый текст и записывает в файл. Я использую эти библиотеки:

#include <stdlib.h> #include <stdio.h> #include <cstdlib> #include <iostream> #include <fstream> #include <string> 

Я также пробовал MinGW как в Cygwin, так и на OS X. Оба выдают ошибки о ‘stoi’ was not declared in this scope. Я попробовал этот патч безуспешно: https://stackoverflow.com/questions/16132176/problems-with-stdstoi-not-working-on-mingw-gcc-4-7-2 Я не знаю, сделает ли MinGW мой. EXE независимо от других файлов.

Как я могу заставить мою программу работать автономно в Windows, чтобы пользователю не требовалось устанавливать какие-либо DLL-файлы или другое программное обеспечение?

-1
То, что вам нужно, требует использования компилятора, который позволяет это, или предоставляет файлы dll с самим .exe. "Так что это не требует никаких DLL-файлов или другого программного обеспечения?" буквально не возможно. Ramhound 8 лет назад 0
Я не понимаю, как это могло быть "буквально невозможно". Существует множество программ для Windows (особенно программ для MS-DOS), которые не требуют от пользователей установки чего-либо, кроме самой Windows. Возможно, вы подумали, что я говорю, что хочу, чтобы он не требовал буквально никакого другого программного обеспечения. Я сделал редактирование, чтобы явным образом указать, что я не хочу, чтобы пользователю требовалось устанавливать какое-либо программное обеспечение, но, конечно, Windows присутствует вместе со своими стандартными файлами .dll. aswine 8 лет назад 0
Вероятно, вам необходимо убедиться, что распространяемые файлы Visual C ++ установлены на другом компьютере (можно загрузить с сайта MS). Я предполагаю, что это жалуется на MSVCR100.dll или что-то подобное. Tom Carpenter 8 лет назад 0
См. Этот [вопрос StackOverflow] (http://stackoverflow.com/questions/3162325/after-building-exe-using-vs-2010-c-missing-msvcp100-dll) о том, как статически связать библиотеку времени выполнения, чтобы вы не делали не нужно распространять установленный. Tom Carpenter 8 лет назад 1
Если вы связываете библиотеку во время компиляции, что вы и сделали, то эта библиотека необходима в системе, в которой будет выполняться исполняемый файл. Программы MS-DOS не являются программами Windows. Если ваша программа не требует дополнительных библиотек, то, что вы описали, сработало бы, так как она требовала их, это означает, что вы связаны с библиотеками и, следовательно, они необходимы. Ramhound 8 лет назад 0
По-видимому, это не невозможно, потому что другие люди говорят о том, что сделали это. http://stackoverflow.com/questions/16167305/why-does-my-application-require-visual-c-redistributable-package Мне просто нужно статически связать их, а не динамически связывать их. Кстати, объяснение понижения было бы неплохо. aswine 8 лет назад 0
Вы утверждаете, что «Windows жаловалась, что несколько файлов .dll не существует». Для нас было бы полезно иметь полный список отсутствующих DLL. BillP3rd 8 лет назад 0
Он был выпущен на том основании, что это далеко от вопроса программирования, который принадлежит мне на мой вкус. Я не знаю, почему я разделяю мою причину, я знаю, что вы не согласитесь с этим и, вероятно, представите своего рода аргумент о том, как я ошибаюсь. Ramhound 8 лет назад 0
@aswine - разъяснение. То, что я сказал, было невозможно, это динамически связать библиотеку, а затем не устанавливать необходимое программное обеспечение. Даже если вы статически связываете необходимые библиотеки, вы все равно должны предоставить их, что в основном означает, что ваше программное обеспечение должно устанавливать эти библиотеки в системе, увеличивая тем самым размер вашего установщика. Я просто указал, что вы хотели, «чтобы не требовалось никаких DLL-файлов или другого программного обеспечения?», По этой причине это было невозможно. Ramhound 8 лет назад 0

1 ответ на вопрос

0
Tom Carpenter

Когда вы компилируете что-то с помощью компилятора Microsoft Visual C ++, он компилирует его для динамической связи с DLL-библиотекой времени выполнения MS VC ++ (я думаю, что это соответствует версии VS, которая у вас есть, например, VS2010 будет использовать среду выполнения 2010). Предположительно это позволяет им иметь возможность обновлять библиотеки DLL без необходимости перекомпиляции приложения.

Это означает, что вам нужно установить библиотеку времени выполнения на любой компьютер, который будет использовать ваше приложение. Они распространяются как часть распространяемых установщиков Visual C ++, доступных на веб-сайте MS. На самом деле на многих компьютерах уже установлены необходимые библиотеки DLL, так как есть много программ, которые устанавливают распространяемый пакет как часть процесса установки. Но это не гарантия, что это так (честно говоря, меня удивляет, что они не устанавливаются автоматически через обновление Windows).

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

Спасибо, Том. Я пытаюсь это сделать, но получаю кучу новых ошибок при компиляции, как "неразрешенный внешний символ __malloc_dbg". aswine 8 лет назад 0
Если этот ответ не полностью отвечает на ваш вопрос, его не следует принимать, поскольку, принимая этот ответ, вы указываете, что ваша проблема решена Ramhound 8 лет назад 0