使用 MinGW C++ 编译 64 位静态库以在 Java (JNI) 中使用

     2023-02-21     266

关键词:

【中文标题】使用 MinGW C++ 编译 64 位静态库以在 Java (JNI) 中使用【英文标题】:Compiling a 64bit static lib with MinGW C++ for usage in Java (JNI) 【发布时间】:2014-03-09 14:09:32 【问题描述】:

这个问题与JNI %1 is not a valid Win32 application 类似的问题。

我还想从 C++ 源代码编译一个 64 位静态库以在 Java 中使用,我也收到错误:

Exception in thread "Thread-2" java.lang.UnsatisfiedLinkError: C:\Users\boon\AppData\Local\Temp\keyboardhook-3382807930283923158.lib: %1 is no valid Win32 application at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(Unknown Source) at java.lang.ClassLoader.loadLibrary(Unknown Source) at java.lang.Runtime.load0(Unknown Source) at java.lang.System.load(Unknown Source) at de.ksquared.system.keyboard.Native.load(Native.java:79) at de.ksquared.system.keyboard.KeyboardHook.(KeyboardHook.java:84) at de.ksquared.system.keyboard.PoolHook.run(KeyboardHook.java:51)

而我想从 Kristian Kraljic (http://kra.lc/blog/2011/07/java-global-system-hook/) 编译 KeyboardHook,并在库中添加一些功能。首先,我尝试使用 Microsoft Visual Studio 2013 编译我的 KeyboardHook.cpp,但 Kristian 建议的编译标志都被忽略了,我也遇到了上面提到的相同异常。因此我将编译器更改为MinGW,并使用以下命令编译成功:

g++ -Wall -c -D_JNI_IMPLEMENTATION_ -Wl,-kill-at -O0 -g3 -fmessage-length=0 -static-libgcc -I”%JAVA_HOME%\include” -m64 -I”%JAVA_HOME%\include \win32″ -shared -o keylib.lib KeyboardHook.cpp

我从克里斯蒂安的建议中接手的大部分旗帜。问题似乎是生成的 .lib 文件似乎仍然不是完全 64 位的。 gcc -dumpmachine 告诉我:x86_64-w64-mingw32,因此应该可以使用 32 位和 64 位作为目标。使用标志-m64 它应该使用 64 位编译,但是还是?我正在使用 minGW build x64-4.8.1-win32-seh-rev5,Windows 7 64bit 和 Java7。

目前我不知道我还能在哪里找到错误。我必须以不同的方式设置链接器标志吗?

【问题讨论】:

您需要将-static-libstdc++ 添加到标志中。为什么?因为如果您尝试使用LoadLibrary("Myplugin.dll") 加载您的.dll,您会注意到它找不到某些库。或者您需要将Mingw64/bin 添加到您的%PATH%。另一件事是确保您的 JVM 是 64 位的。所以再一次,从 64 位可执行文件中尝试LoadLibrary 你自己的插件,看看它是否加载。然后用 Java 尝试它。 您同时使用-static-libgcc-shared?我以为你想要一个静态库? 您能否使用objdump 确定您的.dll 需要哪些外部符号? 从错误消息中,Java 需要一个 DLL(动态库)而不是静态库。出现该错误消息时您在做什么,为什么您认为需要静态库? 首先非常感谢大家的帮助。 CantChooseUsernames,现在可以运行了,谢谢一百万。我添加了标志-static-libstdc++ 和编译工作。关于动态/静态库的问题,我不得不承认我对此知之甚少,我在运行时开始时使用System.load() 加载库,目前是一个静态库(.lib)。我想我可以省略-shared 那么? 【参考方案1】:

在我自己的项目中,我使用以下标志:

-static-libgcc          # Don't require to ship libgcc_s_seh-1.dll with your dll
-static-libstdc++       # Don't require to ship libstdc++-6.dll
-shared                 # As usual. Yeah, static+shared, Windows is beautiful
-Wl,--add-stdcall-alias # The JVM expects _stdcall decoration while mingw produces
                        #  _cdecl. You could use -Wl,-kill-at but this one is clear
-m64                    # I need 64 bits binary code for my 64 bits JVM

我的完整代码可用on GitHub。

【讨论】:

编译一个c++程序,它使用sfml和mingw从linux移植到windows(代码片段)

在尝试编译一个使用sfml但不编译的简单程序(main.cpp)时,我经常搞乱库。我真的和mingw混淆了;mingw如何使用gcc(在这种情况下为g++)以及它如何使用库?看一下这个:x86_64-w64-mingw32-g++-oapp.exemain.cpp-I/usr/include/-I/usr/include/x86_64-lin... 查看详情

使用 mingw-w64 和 cmake 构建 32 位和 64 位应用程序

】使用mingw-w64和cmake构建32位和64位应用程序【英文标题】:Building32Bitand64Bitapplicationuitilizingmingw-w64andcmake【发布时间】:2021-12-0119:30:59【问题描述】:我需要在32位和64位的windows(dll)上构建一个共享库。编译用cmake控制,编译器是m... 查看详情

如何准备代码库以在基于 Windows 和 Unix 的系统上进行编译

...为windows和unix编译我的跨平台应用程序。现在我在Ubuntu上使用makefile,但在我的代码库变得更大之前,我想执 查看详情

windows下的c++编译工具(mingw-w64+cmake)(代码片段)

引言假如想在Windows下进行C++的开发,可以直接使用VisualStudio和相应的C++插件来实现,但编译和构建过程是不可见的。为了更彻底地了解C++工程的编译和构建,可以借助另外两个工具在Windows环境下实... 查看详情

mingw64位32位问题求教

...:mingw-w64-bin_i686-mingw_20110510_sezero.zip显然bin_i686表明gcc等编译工具是32位的,mingw-w64表明编译的目标程序是64位的,即在32位主机上编译64位程序。mingw-w64-bin_x86_64-mingw_20110510_sezero.zip显然bin_i686表明gcc编译工具是64位的,mingw-w64表明... 查看详情

在代码块中使用 mingw gcc 构建 64 位 exe

】在代码块中使用mingwgcc构建64位exe【英文标题】:Building64bitexeusingmingwgccincodeblocks【发布时间】:2015-02-1719:43:13【问题描述】:我正在尝试使用minGW64位构建一个64位exe。可以从here获得(由于项目正在从sourceforge.net转移到mingw-w64.o... 查看详情

如何编译程序以在 64 位机器上工作

...到一条错误消息“无法启动应用程序0xc0000142”而且,我使用的是VisualStudio2008 查看详情

msys2+mingw-w64编译vs2013使用的ffmpeg静态库注意事项

1、环境准备第一步:从http://sourceforge.net/projects/msys2/下载msys2的安装程序安装msys2;第二步:通过msys2的包管理工具pacman安装mingw-w64,包括(gcc,make)等工具;第三步:从github下载ffmpeg最新源代码;2、编译第一步:启动VS2013的命令... 查看详情

使用 mingw-w64 编译 boost

】使用mingw-w64编译boost【英文标题】:Compilingboostwithmingw-w64【发布时间】:2011-05-2316:25:34【问题描述】:我需要在我的Windows64位机器上。我尝试从http://boost.teeks99.com/、boost_1_46_1-vc64-bin.exe链接到预编译的boost_filesystem-vc100-mt和boost_s... 查看详情

如何使用 Visual c++ 2008 编译 64 位

】如何使用Visualc++2008编译64位【英文标题】:HowcanIcompile64bitwithvisualc++2008【发布时间】:2012-03-0215:58:21【问题描述】:使用visualc++2008express版,如何编译64位程序?【问题讨论】:Howtocompilea64-bitapplicationusingVisualC++2010Express?的可能... 查看详情

gcc (Linux/MinGW) 是不是存在编译器标志以在运行时引发除以零错误?

】gcc(Linux/MinGW)是不是存在编译器标志以在运行时引发除以零错误?【英文标题】:Doesacompilerflagexistforgcc(Linux/MinGW)toraiseadivisionbyzeroerroratruntime?gcc(Linux/MinGW)是否存在编译器标志以在运行时引发除以零错误?【发布时间】:2015-11-03... 查看详情

使用 mingw64 c++ 编译 imapi2 应用程序时 imapi2.h 中的错误“没有类型的 '__RPC__range' 声明”

】使用mingw64c++编译imapi2应用程序时imapi2.h中的错误“没有类型的\\\'__RPC__range\\\'声明”【英文标题】:errorsinimapi2.hwhencompilingimapi2appwithmingw64c++"declarationof\'__RPC__range\'withnotype"使用mingw64c++编译imapi2应用程序时imapi2.h中的错误... 查看详情

exec:"gcc":executablefilenotfoundin%path%

...SnQRg  点击“Download”按钮,   在使用mingw64之前,由于其支持较多的编译类型,所以其安装包较多,需要了解其安装包的命名规则:http://sourceforge.net/apps/trac/mingw-w64/wiki/download%20filename%20structure  &nbs... 查看详情

在 minGW-W64 g++ 中编译的 C++ 代码不能在 Ubuntu g++ 中编译

】在minGW-W64g++中编译的C++代码不能在Ubuntug++中编译【英文标题】:C++codecompilinginminGW-W64g++doesnotcompilewithUbuntug++【发布时间】:2016-03-1314:51:40【问题描述】:我在运行Ubuntu的工作站上编译我在Windows10Code::Blocks环境中编写的程序时遇... 查看详情

如何从 SuperBible 获取 GLTools 库以在 Ubuntu 中工作?或替代方案? [关闭]

...06-2115:16:54【问题描述】:我最近买了SuperBible第5版书。我使用Ubuntu12.04LTS。我使用代码::块。我对C++库和设置不 查看详情

ubuntu下使用mingw-w64交叉编译ffmpeg

...实在是太糟糕了,编译速度太感人,因此决定研究Linux下使用mingw-w64交叉编译先是安装ubuntu版的mingw-w64sudoaptinstallmingw-w64然后在configureffmpeg的时候,在正常的配置项之后加上。--arch=x86--target-os=mingw32--cross-prefix=i686-w64-mingw32-上面是3... 查看详情

使用 GCC 将 C++ 应用程序静态编译成二进制文件

】使用GCC将C++应用程序静态编译成二进制文件【英文标题】:StaticallycompileaC++appwithGCCintoabinary【发布时间】:2012-10-2908:14:09【问题描述】:如何在面向unix的Ubuntu机器上使用GCC静态编译应用程序?我将如何定位32位/64位机器和具有... 查看详情

Qt 5的静态编译在mingw下参考off64_t失败

】Qt5的静态编译在mingw下参考off64_t失败【英文标题】:StaticcompilationofQt5failsundermingwwithreferencetooff64_t【发布时间】:2013-11-2116:15:17【问题描述】:我尝试制作静态qt,但在mingw-make期间出错。这是错误文本。static\\qhttpnetworkreply.oacce... 查看详情