C программа не запускается на другом компьютере
Я создал клиентское серверное приложение на C++ с помощью Visual Studio.
Как я могу запустить EXE-файл ничего не устанавливая на компьютер?
приложения, построенные с помощью Visual Studio, зависят от Visual C++ Redistibutable (VCRedist). Когда программа связана динамически, то ваши двоичные файлы будут нуждаться MSVCR**.dll (Библиотека Времени Выполнения Microsoft C).
в MSDN есть хорошая статья под названием распространение файлов Visual C++ (для Visual Studio 2008), который утверждает, что есть потенциальные ошибки во время выполнения на случай, если это не требуется библиотека Visual C++ установлено:
- приложение не удалось правильно инициализировать (0xc0000135).
- это приложение не удалось запустить из-за неправильной конфигурации приложения. Переустановка приложения может устранить эту проблему.
- система не может выполнить указанную программу.
- самым простым решением является изменение динамической компоновки библиотек времени выполнения на статическую компоновку. Зайти в свойства проекта и в разделе C / C++ > Генерация Кода вы найдете Библиотека Времени Выполнения. Вам нужно изменить его с Multi-threaded DLL (/MD) to Multi-threaded (/MT) .
- другое возможное решение-сделать убедитесь, что на целевой машине установлена правильная версия распространяемого пакета Microsoft VC++.
но ваше приложение может зависеть и от других библиотек DLL. Если вы хотите узнать, каковы зависимости вашей программы, есть отличная утилита под названием Зависимость Walker, которые помогут вам в этой и многих других ситуациях :)
Справочная информация:
- приложениям C++ необходимы сборки времени выполнения (DLL) для работы на любом компьютере windows.
- обычно эти сборки времени выполнения расположены на C:\Windows\Winsxs справочник.
- все операционные системы windows по умолчанию поставляются с несколькими сборками времени выполнения.
- но если ваше приложение разработано в более новой версии среды сборки во время выполнения, целевой компьютер также нуждается в той же версии времени выполнения существовать там.
- при установке visual studio на компьютер поступает большинство новых версий сборок времени выполнения.
Soloution: Наконец, в любом случае целевой компьютер должен иметь точные сборки времени выполнения. Есть несколько способов сделать это (для более подробного поиска в google каждый).
- статически связать сборки времени выполнения с вашим приложением (хлопотно для большого приложения).
- установить перераспределение C++ среда в целевом компьютере (самый простой способ).
- создание проекта установки для развертывания во время выполнения на целевом компьютере при установке приложения. (Неплохо)
- развертывание сборок времени выполнения в качестве частных сборок (professional) см. здесь для более подробной информации
условия:
Я не видел эту конкретную ошибку раньше, обычно это ошибка вокруг отсутствующей DLL (Windows redistributable). Предполагая, что на самом деле нет проблем с конфигурацией, у вас есть два варианта:
1) измените режим компиляции с многопоточного DLL на многопоточный. Это можно сделать из раздела c++ свойств проекта в разделе генерация кода. В многопоточном режиме ваш двоичный файл будет статически связан с распространяемым Windows. Это, вероятно, что ты хочешь.
2) Установите распространяемый windows на целевой машине. Это, вероятно, не нормально b / c вы заявляете, что не хотите ничего устанавливать на целевой машине.
предупреждение о опции 1, разные версии windows имеют разные версии распространяемого. Можно столкнуться с узкоспециализированной средой, в которой статически связанная программа будет вести себя не так, как ожидалось.
я развернул свою программу в выпуске вместо отладки, и exe теперь работает на другом компьютере
Похоже, вам не хватает некоторых DLL-файлов. Обязательно скопируйте соответствующие dll вместе с exe.
Репутация: 27
Всего: 154
Я решил раз и навсегда пролить свет на эту тему. так как уже достали =)
Что делать если программа написаная с использованием visual studio 2005 не запускается на другом компьютере.
Во первых, следует пояснить, что (почти)любая программа на с++ использует стандартную библиотеку - c runtime library, которая содержит набор функций, используемых программой. Например функции для работы с динамической памятью, со строками, с файлами и много чего еще. Эта библиотека может компоноваться либо динасически, либо статически. Так-же существует release и debug версии библиотеки. По умолчанию, когда вы создаете проект в visual studio, он настроен на использование динамической библиотеки. Поэтому, приложение можно будет запустить только на компьютерах, с установленной CRT библиотекой нужной версии.
Самый очевидный способ решения поблемы - уствновить вместе с приложением нужные библиотеки. Для этого существует Microsoft Visual C++ 2005 Redistributable Package (x86/IA64). Этот пакет устанавливает стандартную библиотеку с++ (MSVCR80.dll) а так-же ATL, MFC и OpenMP библиотеки. После этого ваше приложение можно запускать на этой машине.
Чуть менее очевидный способ - статическая компоновка. Заходим в опции проекта, находим там опции компилятора (C/C++ -> Code Generation), и меняем параметр Runtime Library с "Multi Threaded DLL (/MD)" на "Multi Threaded (/MT)". Для отладочной версии программы нужно поменять "Multi Threaded Debug DLL (/MDd)", на "Multi Threaded Debug (/MTd)". После перекомпиляции, несем программу на любую машину и запускаем.
Репутация: 6
Всего: 162
Следует заметить, что Visual Studio - не единственная среда разработки
А так - спасибо за старания.
Репутация: 27
Всего: 154
Репутация: 85
Всего: 196
Итак, открываем полученный файл exe с помощью вьюера, и ищем по ".DLL" (без кавычек и учета регистра) или другому расширению (например, ".BPL" для BCB), в зависимости от того, на что ругается программа. Будут находиться всякие библиотеки, в т.ч. и стандартные (kernel32.dll, user32.dll и пр.) и не очень. Последние нужно скопировать в дистрибутив. затем ту же операцию повторить для всех библиотек. и так до тех пор, пока не будут найдены все зависимости.
Репутация: 27
Всего: 154
Репутация: нет
Всего: 15
А я depends (Dependency Walker). Не знаю, как в Total Commander, а здесь такого рода ошибки выдаются наглядно.
Репутация: нет
Всего: 52
Модераторы, думаю эту тему стоит закрепить отдельно?
Репутация: 6
Всего: 162
Репутация: нет
Всего: нет
Репутация: 27
Всего: 154
Репутация: нет
Всего: нет
Цитата |
Заходим в опции проекта, находим там опции компилятора (C/C++ -> Code Generation), и меняем параметр Runtime Library с "Multi Threaded DLL (/MD)" на "Multi Threaded (/MT)". |
При компиляции выдаёт:
( * У меня Microsoft Visual Studio 2008)
Репутация: 6
Всего: 118
использовать ее примерно так:
покажет импортные библиотеки и функции (хотя не умеет делать глубокого сканирования, как, например, depends)
Что-то не поняли? -> Напейтесь до зеленых человечков. эта сверхцивилизация Вам поможет.
Репутация: 1
Всего: 3
Цитата |
Заходим в опции проекта, находим там опции компилятора (C/C++ -> Code Generation), и меняем параметр Runtime Library с "Multi Threaded DLL (/MD)" на "Multi Threaded (/MT)". |
При компиляции выдаёт:
Балмер! Я узнал тебя
Репутация: нет
Всего: нет
Репутация: 85
Всего: 196
Модератор: для вопросов по билдеру есть свой раздел.
Запрещается!
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
- Действия модераторов можно обсудить здесь
- С просьбами о написании курсовой, реферата и т.п. обращаться сюда
- Вопросы по реализации алгоритмов рассматриваются здесь
- FAQ раздела лежит здесь!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.
[ Время генерации скрипта: 0.1439 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Читайте также: