Отсутствует ошибка msvcr100.dll при запуске исполняемого файла, созданного с помощью MinGW - PullRequest
0 голосов
/ 24 августа 2011

Я успешно компилирую (с MinGW) и запускаю свою программу на C ++ (которая вызывает классы Java через JNI), состоящую из нескольких файлов в моей системе Win7-64bit. Компиляция и запуск выполняется двумя пакетными файлами. Я установил Visual Studio C ++ 2010 некоторое время назад, но с тех пор не использовал его.

Я сейчас пытаюсь развернуть эту программу на другом компьютере под управлением WinXP-32bit, и я сталкиваюсь с ошибкой «отсутствует msvcr100.dll». Я установил последнюю версию MinGW и JDK, я скомпилировал свою программу, используя тот же пакетный файл, но когда я его запускаю, я получаю сообщение об ошибке. Visual Studio не используется ни в одной части здания (и я не хочу этого), поэтому мне странно, что я получаю это сообщение о MSVC ++ dll.

compile.bat

rem Set the include paths for the JNI header files("include" and "include\win32" inside the jdk (32-bit) directory).
set JDK_INCLUDE="C:\Program Files\Java\jdk1.7.0\include"
set JDK_INCLUDE_WIN32="C:\Program Files\Java\jdk1.7.0\include\win32"

set PATH=%PATH%;C:\MinGW\bin

rem Build an import library for the jvm.dll from the .\lib\jvm.def file (see http://www.inonit.com/cygwin/jni/invocationApi/archive.html)
dlltool --input-def .\lib\jvm.def --kill-at --dllname jvm.dll --output-lib .\lib\libjvm.dll.a

rem Set the import library directory.
set JVM_IMPORT_DLL=".\lib"

rem Compile all files (including the IngToolTest.cpp) and create an executable file .\bin\COFORM_JNI.exe
g++ -I%JDK_INCLUDE% -I%JDK_INCLUDE_WIN32% .\src\DataTypes\file1.cpp .\src\IngestionTool\file2.cpp ... .\src\file25.cpp Test.cpp -L%JVM_IMPORT_DLL% -ljvm -o .\bin\executable.exe

pause

run.bat

Rem Set the environment parameter to the path where the properties file resides.
set CONFIG_DIR=..

Rem Set the environment parameter to the actual IP of your VM machine.
set VM_URL=139.191.173.43

Rem Set the location of the jvm.dll (32-bit)
set PATH=%PATH%;C:\Program Files\Java\jdk1.7.0\jre\bin\client

move *.rdf RDFS

.\bin\executable.exe

pause

Возможно ли, что это вызвано одним из моих внешних включений? Вот они:

#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <jni.h>
#include <vector>
#include <string.h>
#include <fstream>
using namespace std;

Буду признателен за помощь в преодолении этой ошибки.

K

Ответы [ 3 ]

5 голосов
/ 24 августа 2011

Хотя MinGW является дистрибутивом GCC, для того, чтобы он мог работать в Windows без наличия уровня эмуляции Linux, такого как Cygwin, он не использует библиотеку GNU C.Вместо этого он использует Microsoft C Runtime.Я не использовал MinGW некоторое время, когда он использовал MSVCRT.DLL из VC ++ 6.0, который был более или менее повсеместным в установках Windows в то время, когда он поставлялся с установками начиная с поздних выпусков Win95.

Вполне возможно, что ваша установка Windows не имеет более поздней среды выполнения, если она не была распространена вместе с ней, и вы не установили ни одного приложения, с которым она распространялась.Может случиться так, что у вас есть только 64-битная DLL и вам нужно установить 32-битную DLL.

Простое решение - установить распространяемые пакеты Microsoft VC ++.

Распространяемый пакет Microsoft Visual C ++ 2010 (x64)

Распространяемый пакет Microsoft Visual C ++ 2010 (x86)


Добавлено примечание: Согласно обоим http://mingw -w64.sourceforge.net / и http://www.mingw.org, MinGW по-прежнему зависит от MSVCRT.DLL, поэтому мне интересно, что вы сделали или где вы получили свой дистрибутив, чтоделает это зависит от MSVCRT100.DLL?Может, какая-нибудь экспериментальная сборка?

2 голосов
/ 24 августа 2011

DLL содержит среду выполнения для скомпилированных программ. Он должен быть установлен на другом компьютере, чтобы запустить программу.

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

См. Здесь для загрузки инструкции

http://www.microsoft.com/download/en/details.aspx?id=5555

0 голосов
/ 24 августа 2011

MinGW просто эмулирует вызовы ОС Linux. Позвольте мне объяснить ..

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

Как приложение узнает, по какому «адресу» существует метод выделения?

Когда вы компилируете двоичный файл, вы привязываете к нему "C runtime library (CRT)". Эта библиотека содержит все сопоставления для взаимодействий ОС, которые потребуются двоичному файлу. Так, например, когда вы связываете CRT, двоичный файл теперь знает, где он может найти функцию выделения памяти, предоставляемую ОС.

MinGW, вставляет уровень эмуляции, так что приложение считает, что оно связывается с CRT Linux, но на самом деле уровень эмуляции просто перенаправляет вызовы в Microsoft CRT.

Windows имеет несколько различных ЭЛТ. На всех дистрибутивах вы можете найти где-нибудь в %PATH% файл msvcrt.dll. Этот файл предоставляет всю поддержку, необходимую для запуска двоичного файла в ОС.

При установке Visual Studio вы получаете обновленные версии CRT:

  1. В VS 2005: msvcrt80.dll
  2. В VS 2008: msvcrt90.dll
  3. В VC 2010: msvcrt100.dll

Очевидно, установив Visual Studio, вы заставили слой эмуляции MinGW связываться с msvcrt100.dll, а не с msvcrt.dll, который распространяется на всех компьютерах с Windows. Я не знаю, почему это происходит, но это IS , что происходит.

EDIT

Команда:

dlltool --input-def .\lib\jvm.def --kill-at --dllname jvm.dll --output-lib .\lib\libjvm.dll.a

При создании файла, который ссылается на jvm.dll, может возникнуть зависимость msvcrt100.dll. То есть jvm.dll может быть динамически связано с новейшей ЭЛТ, а поскольку вам требуется jvm.dll, вам косвенно требуется msvcrt100.dll.

Найдены ли какие-либо dll в "" C: \ Program Files \ Java \ jdk1.7.0 \ bin "?

...