我正在成功编译(使用MinGW)并运行我的C ++程序(通过JNI调用Java类),该程序由Win7-64bit系统上的多个文件组成。编译和运行由2个批处理文件完成。我不久前安装了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;
我很感激帮助您克服这个错误。
ķ
答案 0 :(得分:5)
虽然MinGW是GCC的发行版,但是为了允许它在Windows上本机运行而没有像Cygwin这样的Linux仿真层,它不使用GNU C库。相反,它使用微软的C运行时。当我使用VC ++ 6.0中的MSVCRT.DLL时,我还没有使用过MinGW,这在当时的Windows安装中或多或少无处不在,因为它自Win95版本以来一直在安装。
如果Windows的安装没有与它一起发布,并且您没有安装任何与之分发的应用程序,那么很可能您的Windows安装没有更高版本的运行时。可能您只有64位DLL并需要安装32位DLL。
简单的解决方案是安装Microsoft的VC ++可重新分发软件包。
Microsoft Visual C++ 2010 Redistributable Package (x64)
Microsoft Visual C++ 2010 Redistributable Package (x86)
添加注意:根据http://mingw-w64.sourceforge.net/和http://www.mingw.org,MinGW仍然依赖于MSVCRT.DLL,所以我想知道你做了什么或者你在哪里获得了你的发行版是否依赖于MSVCRT100.DLL?可能还有一些实验性构建?
答案 1 :(得分:2)
DLL包含已编译程序的运行时。它必须安装在另一台机器上才能运行该程序。
标准程序发行版有一个安装包可以为您执行此操作,或者您可以手动安装它。
请参阅此处获取下载说明
答案 2 :(得分:-2)
MinGW仅模拟Linux OS调用。让我解释..
当您停止在某个操作系统上运行的二进制文件时,该二进制文件需要知道如何与底层操作系统进行交互。这对于内存分配这一点非常重要。二进制文件本身并不“知道”如何分配RAM,而是要求主机OS为其提供一些RAM。它通过调用驻留在OS内预定“地址”的分配函数来完成此操作。
应用程序如何知道分配方法存在于哪个“地址”?
编译二进制文件时,将它绑定到“C运行时库(CRT)”。该库包含二进制文件所需的OS交互的所有映射。因此,例如,当您链接CRT时,二进制文件现在知道它可以在哪里找到操作系统公开的内存分配函数。
MinGW,插入一个仿真层,使应用程序认为它链接到Linux CRT,但实际上,仿真层只是将调用重定向到Microsoft CRT。
Windows,有许多不同的CRT可用。在所有发行版中,您可以在%PATH%
中的某个位置找到文件msvcrt.dll
。该文件提供了二进制文件在操作系统中运行所需的所有支持。
安装Visual Studio时,您将获得CRT的更新版本:
显然,通过安装Visual Studio,您已经使MinGW的仿真层与msvcrt100.dll
链接,而不是msvcrt.dll
,它们分布在所有Windows机器上。我不知道为什么会这样,但 IS 正在发生的事情。
修改强>
命令:
dlltool --input-def .\lib\jvm.def --kill-at --dllname jvm.dll --output-lib .\lib\libjvm.dll.a
生成jvm.dll
中链接的文件可能会创建msvcrt100.dll
依赖项。也就是说,jvm.dll
可能会与最新的CRT动态关联,因为您需要jvm.dll
,间接需要msvcrt100.dll
。
“C:\ Program Files \ Java \ jdk1.7.0 \ bin”中是否有任何dll?