Visual C ++ / Studio: неверная конфигурация приложения? - PullRequest
3 голосов
/ 19 сентября 2008

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

Ответы [ 10 ]

5 голосов
/ 19 сентября 2008

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

http://www.dependencywalker.com/

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

5 голосов
/ 19 сентября 2008

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

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

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

1 голос
/ 29 декабря 2009

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

#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/

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

1 голос
/ 12 октября 2009

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

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

CRT DEBUG: я где-то заметил, что (независимо от того, как сильно я пытался, и, очевидно, до сих пор не получилось), моя версия Release все еще зависела от CRT DEBUG. Если это все еще так, модуль слияния InstallShield теперь поместил папку DEBUG CRT в мою папку WinSXS :) Будучи новичком в VC ++, я предполагаю, что это обычно используется для распространения отладочных версий ваших программ другим людям. Чтобы проверить, исправило ли это мою проблему, я удалил папку DEBUG CRT из папки WinSXS, и приложение все еще работало. (Если что-то еще не работает в фоновом режиме и т. Д. И т. Д. - я не в этом)

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

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

1 голос
/ 20 сентября 2008

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

\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86
1 голос
/ 19 сентября 2008

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

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

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

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

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

1 голос
/ 19 сентября 2008

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

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

Visual C ++ 2005

Visual C ++ 2005 SP1

Visual C ++ 2008

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

0 голосов
/ 11 ноября 2009

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

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

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

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

Вам следует искать имена файлов, например, myprogram.exe.indermediate.manifest

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

0 голосов
/ 07 ноября 2008

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

0 голосов
/ 19 сентября 2008

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

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