Visual C++/Студия:Неправильная конфигурация приложения?

StackOverflow https://stackoverflow.com/questions/99479

Вопрос

Моя программа на C (++), написанная и скомпилированная с использованием Visual C (++) / Visual Studio, отлично работает на моем собственном компьютере, но отказывается запускаться на другом компьютере.Сообщение об ошибке, которое я получаю, звучит так: "Этому приложению не удалось запуститься из-за неправильной конфигурации приложения.Переустановка приложения может устранить эту проблему ".

Это было полезно?

Решение

Если вы пишете программу на C ++, она динамически связывается с библиотекой времени выполнения C, или сокращенно CRT.Эта библиотека содержит ваш printf, ваш malloc, ваш strtok и так далее.Библиотека содержится в файле с именем MSVCR80.DLL.Этот файл по умолчанию не установлен в системе Windows, поэтому приложение не может запуститься.

Каково решение?Либо установите DLL на целевой компьютер через VCREDIST.EXE (распространяемый пакет Visual C ++), либо создайте статическую ссылку на CRT (вставьте фактический код для используемых функций прямо в ваш EXE-файл).

Распространять и устанавливать VCREDIST вместе с простым приложением - сплошная заноза в заднице, поэтому я выбрал второй вариант:статическое связывание.Это действительно просто:перейдите в свойства вашего проекта, разверните C / C ++, нажмите "Генерация кода" и установите для библиотеки времени выполнения один из параметров, отличных от DLL.Вот и все, что от него требуется.

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

Проблема здесь заключается в отсутствующей зависимости от DLL, такой как CRT (библиотека времени выполнения C).Хорошим инструментом для диагностики такого рода проблем является Dependency Walker (depends.exe), который вы можете найти здесь:

http://www.dependencywalker.com/

Вы должны запустить эту программу на компьютере, который генерирует опубликованное вами сообщение об ошибке, и использовать ее для открытия exe-файла, генерирующего эту ошибку.Средство управления зависимостями быстро и наглядно укажет все библиотеки DLL, которые требуются, но недоступны на компьютере.

Высока вероятность того, что вам не хватает библиотек среды выполнения Visual Studio (CRT среди прочих), вы можете либо избавиться от этих зависимостей (связать статически), либо установить пакеты повторного списка VC на целевой компьютер.

В зависимости от используемой вами версии Visual C ++ вам необходимо установить разные пакеты :

Visual C ++ 2005

Visual C++ 2005 SP1

Visual C ++ 2008

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

Гораздо проще всего статически привязаться к среде выполнения.

c ++ -> Генерация кода -> Библиотека среды выполнения и выберите "многопоточный / MT".

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

Новый проект -> "настройка и развертывание" -> "проект настройки"

Загрузите выходные данные из ваших прикладных проектов (определенных с использованием DLL-версии среды выполнения) в проект установщика и соберите его.Зависимость от библиотеки DLL runtime будет замечена, включена в установочный пакет и аккуратно и ненавязчиво установлена в нужном месте на целевой машине.

Правильный пакет повторной регистрации VC для вас является частью вашей установки Visual Studio.Для VC 8 вы можете найти его здесь:

\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86

ВОЗМОЖНОЕ РЕШЕНИЕ........

Редактировать:(удалена большая часть моего поста) Короче говоря, у меня были похожие проблемы, я получал сообщения "Неправильная конфигурация приложения" и т.д. И т.п.Depends.exe я нашел только ieshims.dll и wer.dll как возможные проблемы, но проблема не в этом.В итоге я использовал опцию многопоточной компиляции (/ mt).Однако что сработало, как работоспособное решение, так это создание установщика с помощью InstallShield.Я выбрал несколько модулей слияния в installshield builder, и это, похоже, устранило мою проблему.Выбранными модулями были:VC ++ 9.0 CRT, VC ++ 9.0 ОТЛАДОЧНЫЙ CRT и модуль объединения CRT WinSxS MSM.Я почти уверен, что это исправил модуль слияния WinSxS.

ОТЛАДОЧНЫЙ ЭЛТ:Я где-то заметил, что (независимо от того, как сильно я старался и, очевидно, пока потерпел неудачу), моя версия выпуска все еще зависела от CRT отладки.Если это все еще так, модуль слияния InstallShield теперь поместил папку DEBUG CRT в мою папку WinSxS :) Будучи в некоторой степени новичком в работе с VC ++, я предполагаю, что обычно это используется для распространения отладочных версий ваших программ среди других людей.Чтобы проверить, устранило ли это мою проблему, я удалил папку DEBUG CRT из папки WinSxS, и приложение по-прежнему работало.(Если только что-то все еще не работает в фоновом режиме и т.д. И т.п. - мне это не очень нравится)

Во всяком случае, у меня все работает на полностью обновленной машине XP SP3, а также на машине VMware XP SP3 с голыми костями (в основном .net 3.5 и VC ++ 2008 RTM), а также на машине mate XP, где это ранее не работало.

Так что попробуйте эти штуки, возможно, вам повезет.

Первое, что вы должны использовать

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

или добавить _BIND_TO_CURRENT_VCLIBS_VERSION=1 к директивам препроцессора.

Проблема связана с привязкой и типами манифестов, вы можете найти больше http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/

Делая это, ваше приложение будет работать с более широким диапазоном версий библиотек времени выполнения.

Часто эта ошибка является результатом попытки запустить отладочную версию приложения, использующего .NET.Поскольку распространяемый пакет .NET не включает отладочные версии библиотек DLL, которые устанавливаются с Visual Studio, ваше приложение часто будет получать эту ошибку при запуске на любом другом компьютере, на котором не установлена Visual Studio.Если вы еще этого не сделали, попробуйте создать релизную версию своего приложения и посмотрите, работает ли это.

Обратите также внимание, что если вы перейдете на статическую среду выполнения, вам придется сделать то же самое для MFC, если ваше приложение использует MFC.Эти настройки находятся в разделе свойства-> Конфигурация / Общие

Я столкнулся с этой проблемой и смог исправить ее очень просто.

Visual Studio предоставляет вам возможность (включена по умолчанию) создавать манифест для каждой сборки.

Манифест был помещен в папку release, но это была другая папка release, чем exe.

Даже при использовании утилит настройки он не был упакован.

Вы должны искать имена файлов, что-то вроде myprogram.exe.indermediate.manifest

Если это находится в той же папке, что и exe-файл (и у вас есть все библиотеки DLL), он должен запуститься

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top