运行使用MinGW生成的可执行文件时缺少msvcr100.dll错误 我成功编译(MinGW),运行我的C++程序(通过JNI调用java类),由我的WiN-764位系统上的多个文件组成。编译和运行由2个批处理文件完成。我安装了VisualStudioC++ 2010,但自从那时以来就没有使用过。

运行使用MinGW生成的可执行文件时缺少msvcr100.dll错误 我成功编译(MinGW),运行我的C++程序(通过JNI调用java类),由我的WiN-764位系统上的多个文件组成。编译和运行由2个批处理文件完成。我安装了VisualStudioC++ 2010,但自从那时以来就没有使用过。,c++,java-native-interface,mingw,C++,Java Native Interface,Mingw,我现在正试图将此程序部署到另一台运行WinXP-32位的计算机上,我面临一个“missing msvcr100.dll”错误。我安装了最新的MinGW和JDK,我使用相同的批处理文件编译了我的程序,但是当我运行它时,我得到了错误。VisualStudio没有在建筑的任何部分使用(我也不希望它使用),所以我觉得奇怪的是,我收到了关于MSVC++dll的消息 编译.bat rem Set the include paths for the JNI header files("include" and

我现在正试图将此程序部署到另一台运行WinXP-32位的计算机上,我面临一个“missing msvcr100.dll”错误。我安装了最新的MinGW和JDK,我使用相同的批处理文件编译了我的程序,但是当我运行它时,我得到了错误。VisualStudio没有在建筑的任何部分使用(我也不希望它使用),所以我觉得奇怪的是,我收到了关于MSVC++dll的消息

编译.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
跑吧,蝙蝠

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;
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
如果有人能帮我克服这个错误,我将不胜感激


K

DLL包含编译程序的运行时。它必须安装在另一台机器上才能运行该程序

标准程序发行版有一个安装包,可以为您执行此操作,也可以手动安装

有关下载说明,请参见此处


DLL包含编译程序的运行时。它必须安装在另一台机器上才能运行该程序

标准程序发行版有一个安装包,可以为您执行此操作,也可以手动安装

有关下载说明,请参见此处


MinGW只模拟Linux操作系统调用。让我解释一下

当您创建在特定操作系统上运行的二进制文件时,该二进制文件需要知道如何与底层操作系统交互。这对于内存分配之类的事情很重要。二进制文件本身并不“知道”如何分配RAM,相反,它要求主机操作系统给它一些RAM。它通过调用驻留在操作系统内部预定“地址”的分配函数来实现这一点

应用程序如何知道分配方法的“地址”

当您编译二进制文件时,您将一个“C运行时库(CRT)”绑定到它。该库包含二进制文件需要的操作系统交互的所有映射。例如,当您链接CRT时,二进制文件现在知道在哪里可以找到操作系统公开的内存分配函数

MinGW插入了一个仿真层,这样应用程序就可以认为它链接到了Linux CRT,但实际上,仿真层只是将调用重定向到Microsoft CRT

Windows有许多不同的CRT可用。在所有发行版上,您都可以在
%PATH%
文件
msvcrt.dll
中找到。此文件提供了二进制文件在操作系统中运行所需的所有支持

安装Visual Studio时,您将获得CRT的更新版本:

  • 在VS2005中:msvcrt80.dll
  • 在VS 2008中:msvcrt90.dll
  • 在VC 2010中:msvcrt100.dll
  • 显然,通过安装VisualStudio,您已经使MinGW的仿真层链接到
    msvcrt100.dll
    ,而不是所有windows机器上的
    msvcrt.dll
    。我不知道为什么会发生这种情况,但这就是正在发生的事情

    编辑

    命令:

    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?

    MinGW仅模拟Linux操作系统调用。让我解释一下

    当你创建一个运行在某个操作系统上的二进制文件时,该二进制文件需要知道如何与底层操作系统交互。这对于内存分配之类的事情很重要。二进制文件本身并不“知道”“如何分配RAM,相反,它要求主机操作系统给它一些RAM。它通过调用驻留在操作系统内部预定“地址”的分配函数来实现这一点

    应用程序如何知道分配方法的“地址”

    当您编译二进制文件时,您将一个“C运行时库(CRT)”绑定到它。该库包含二进制文件需要的操作系统交互的所有映射。例如,当您链接CRT时,二进制文件现在知道在哪里可以找到操作系统公开的内存分配函数

    MinGW插入了一个仿真层,这样应用程序就可以认为它链接到了Linux CRT,但实际上,仿真层只是将调用重定向到Microsoft CRT

    Windows有许多不同的CRT可用。在所有发行版上,您都可以在
    %PATH%
    文件
    msvcrt.dll
    中找到。此文件提供了二进制文件在操作系统中运行所需的所有支持

    安装Visual Studio时,您将获得CRT的更新版本:

  • 在VS2005中:msvcrt80.dll
  • 在VS 2008中:msvcrt90.dll
  • 在VC 2010中:msvcrt100.dll
  • 显然,通过安装VisualStudio,您已经使MinGW的仿真层链接到
    msvcrt100.dll
    ,而不是所有windows机器上的
    msvcrt.dll
    。我不知道为什么会发生这种情况,但这就是正在发生的事情

    编辑

    命令:

    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”中是否找到任何dll