Не запускается exe файл visual studio
Код работает, но я не понимаю, почему я не могу запустить .exe, созданный из скомпилированного проекта c с использованием gcc (что является моей целью).
Я тоже пытался работать от имени администратора.
Кто-нибудь может мне объяснить?
2 ответа
(Преобразование моего комментария в ответ)
Код работает, но я не понимаю, почему я не могу запустить .exe, созданный из скомпилированного проекта c с использованием gcc (что является моей целью).
Я подозреваю, что проблема в том, что ваш скомпилированный исполняемый файл gcc во время выполнения имеет зависимости от файлов, расположенных в том же каталоге файловой системы, что и ваш скомпилированный gcc исполняемый файл, и ссылается на эти файлы только по их коротким именам (например, " someFile.txt ") вместо их имен файлов с абсолютным путем (например, "C:\my-gcc-program\bin\someFile.txt" ), тогда ОС просматривает рабочий каталог этого процесса (также известный как текущий каталог).
Обратите внимание, что когда ваша программа использует Process.Start(String fileName) , тогда вновь созданный (дочерний) процесс ОС наследует рабочий каталог вашего процесса, а не сбрасывается в родительский каталог имени исполняемого файла нового процесса!
Поэтому, если ваш дочерний процесс ожидает, что "someFile.txt" находится в его рабочем каталоге, вам необходимо запустить дочерний процесс с правильным рабочим каталогом, а не наследовать его от вашего процесса.
Вы можете сделать это двумя разными способами, каждый из которых требует от вас использования ProcessStartInfo вместо любой из перегрузок Process.Start , которые принимают String fileName .
Вариант 1. Установите ProcessStartInfo.WorkingDirectory напрямую:
Параметр UseShellExecute создает новый процесс, как если бы пользователь запустил его через оболочку своей ОС, например cmd.exe или Explorer.exe , а не как дочерний процесс вашего процесса. (Одним из многих) эффектов этой опции является то, что ОС автоматически устанавливает рабочий каталог этого нового процесса за вас.
Обратите внимание, что при использовании UseShellExecute == true вы все равно должны указать действительный путь WorkingDirectory , однако его цели меняются:
- Свойство WorkingDirectory ведет себя иначе при UseShellExecute is true , чем при UseShellExecute is false .
- Когда UseShellExecute истинно, свойство WorkingDirectory указывает местоположение исполняемого файла.
- Если WorkingDirectory - пустая строка, считается, что текущий каталог содержит исполняемый файл.
- При UseShellExecute is true рабочий каталог приложения, запускающего исполняемый файл, также является рабочим каталогом исполняемого файла.
Я размещаю здесь код, который я написал в событии нажатия кнопки. Может быть кому-то пригодится
Я создал клиентское серверное приложение на 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
Есть еще универсальный способ (которым пользуюсь я), который подходит и к другим средам программирования (в т.ч. BCB, Delphi и пр.). Для этого понадобится какая-нибудь программа для просмотра содержимого бинарных файлов. Я использую вьюер входящий в состав Total Commander.
Всего: 196
Итак, открываем полученный файл exe с помощью вьюера, и ищем по ".DLL" (без кавычек и учета регистра) или другому расширению (например, ".BPL" для BCB), в зависимости от того, на что ругается программа. Будут находиться всякие библиотеки, в т.ч. и стандартные (kernel32.dll, user32.dll и пр.) и не очень. Последние нужно скопировать в дистрибутив. затем ту же операцию повторить для всех библиотек. и так до тех пор, пока не будут найдены все зависимости.
Репутация: 27
bsa, действительно так можно делать, а я и не знал
Всего: 154
Репутация: нет
Всего: 15
А я depends (Dependency Walker). Не знаю, как в Total Commander, а здесь такого рода ошибки выдаются наглядно.
Репутация: нет
Всего: 52Модераторы, думаю эту тему стоит закрепить отдельно?
Ни что не внушает сна крепче, чем день приисполненный трудов!Репутация: 6
Всего: 162Репутация: нет
Для 2008 студии только установка Microsoft Visual C++ 2008 Redistributable Package (x86/IA64)?Или есть альтернатива?
Всего: нет
Репутация: 27
Всего: 154Репутация: нет
Всего: нетЦитата
Заходим в опции проекта, находим там опции компилятора (C/C++ -> Code Generation), и меняем параметр Runtime Library с "Multi Threaded DLL (/MD)" на "Multi Threaded (/MT)".При компиляции выдаёт:
( * У меня Microsoft Visual Studio 2008)
Репутация: 6
кроме depends (входящей в состав VS) есть утилита dumpbin
Всего: 118
использовать ее примерно так:
покажет импортные библиотеки и функции (хотя не умеет делать глубокого сканирования, как, например, depends)
Что-то не поняли? -> Напейтесь до зеленых человечков. эта сверхцивилизация Вам поможет.Репутация: 1
Всего: 3Цитата
Заходим в опции проекта, находим там опции компилятора (C/C++ -> Code Generation), и меняем параметр Runtime Library с "Multi Threaded DLL (/MD)" на "Multi Threaded (/MT)".При компиляции выдаёт:
Балмер! Я узнал тебя
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошоРепутация: нет
Всего: нетРепутация: 85
skylex, легко - зайти в настройки проекта и удали все run-time packages, а в настройках линкера включи линковку со статическими библиотеками (кажется, static RTL, или что-то в этом духе).
Всего: 196
Модератор: для вопросов по билдеру есть свой раздел.
Запрещается!
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
- Действия модераторов можно обсудить здесь
- С просьбами о написании курсовой, реферата и т.п. обращаться сюда
- Вопросы по реализации алгоритмов рассматриваются здесь
- FAQ раздела лежит здесь!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.
[ Время генерации скрипта: 0.1936 ] [ Использовано запросов: 21 ] [ GZIP включён ]
К сожалению, единого метода решения для ошибки «Microsoft Visual C++ Runtime Library» нет, так как причины могут быть разными: отсутствующие или поврежденные компоненты системы, влияние сторонних служб и программ, в некоторых случаях — ошибки в самой запускаемой программе (особенно если она была написана вами лично).
Язык программ, не поддерживающих Юникод и пути к папкам с программой
Этот способ решения часто оказывается результативным для пользователей с русскоязычными версиями Windows 10, 8.1 или Windows 7, при условии, что ошибка Microsoft Visual C++ Runtime Library вызывается какой-то сторонней программой, а не системными компонентами, такими как explorer.exe или SystemSettings.exe.
- Если запускаемая игра или программа (или её установщик) находится в папке, путь к которой содержит кириллицу (русские буквы), перенесите её в другое расположение или переименуйте папку, попробуйте запустить. Например, если ваше имя пользователя на русском языке, а файл запускается из папки «Загрузки», то полный путь к ней будет иметь види это может послужить причиной ошибки.
- Зайдите в Панель управления (в Windows 10 панель управления можно открыть через поиск на панели задач) — Региональные стандарты, откройте вкладку «Дополнительно» и в разделе «Язык программ, не поддерживающих Юникод» нажмите «Изменить язык системы». Выберите «Английский (США)», примените настройки и перезагрузите компьютер, затем проверьте, решило ли это проблему.
Обратите внимание, что второй метод может решить проблему, но при этом сделать так, что программа или игра будет запускаться на английском языке — обычно в этом случае достаточно найти соответствующую настройку в самой программе, чтобы вернуть русский язык.
Здесь присутствует один нюанс: обычно мы не знаем, какие именно из многочисленных наборов распространяемых компонентов Microsoft Visual C++ послужил причиной проблемы, а потому я рекомендую следующих подход их переустановки:
Если указанные шаги не решили проблему, выполните следующие шаги:
Драйверы видеокарты и DirectX
После установки драйверов, DirectX и перезагрузки компьютера, проверьте, была ли решена проблема.
Дополнительные методы решения проблемы
- Удалить программы, установленные непосредственно перед появлением ошибки. По отзывам, причиной может быть самое разное стороннее ПО, среди примеров: Intel True Key, программы принтеров HP, антивирусы.
- Использовать точки восстановления системы при их наличии.
- Выполнить чистую загрузку (не путать с установкой) Windows. Если при чистой загрузке ошибка исчезает, то причина — какие-то программы в автозагрузке или сторонние службы. Можно включать их группами, пока не выявим, что именно вызывает ошибку. Как именно выполнить чистую загрузку описано в инструкции Чистая загрузка Windows. .
- Отдельная инструкция для этой же ошибки с кодом R6025 pure virtual function call
Ещё один вариант, для случая, когда ошибку вызывает какой-то системный процесс — создать нового пользователя Windows (лучше, если будет использовано имя на латинице), зайти в систему под ним и проверить, сохраняется ли ошибка у этого пользователя.
Видео инструкция
Надеюсь, проблема была решена. Если это так, буду благодарен комментарию, в котором вы расскажете, что именно оказалось причиной в вашем случае — это может помочь другим пользователям, столкнувшимся с ошибкой.
А вдруг и это будет интересно:
28.01.2021 в 22:31
Есть вопрос к вам по поводу купленного самсунг 980 про и материнки гигабайт аорус мастер z390 так вот нету ни в одной программе ни информации про смарт ни трим ни Ncq ни остального только есть немного инфы в меджикан. у людей на ютюбе эта информация есть
29.01.2021 в 14:49
10.07.2021 в 12:06
В статью можно добавить sxtrace как один из способов.
У меня прога на работе требует vc++ x86 2005ые, но их оказывается есть несколько версий, и с помощью sxtrace можно точно узнать версию требуемой библиотеки.Читайте также:
- Когда UseShellExecute истинно, свойство WorkingDirectory указывает местоположение исполняемого файла.