MinGW's compiler option Wl,--kill-at does not work

女生的网名这么多〃 提交于 2020-01-15 08:15:12

问题


I am currently struggling to compile a Dll for JNI use, using Eclipse CDT and MinGW.

Following a tutorial, i created a Java class that declares native methods, then used javah to get the relevant header file and I implemented it in a C++ class.

The C++ code is very simple and compilation works, but when I load the library into the Java class, i get this error :

Exception in thread "main" java.lang.UnsatisfiedLinkError: Main.integerMethod(I)I
    at Main.integerMethod(Native Method)
    at Main.main(Main.java:12)

I "explored" the dll and found out that the methods that should be called all have a suffix like "@14". The problem is, I am already using the -Wl,--kill-at compiler option which should remove these very embarassing tags... So why is it not working ?

The compilation log is following :

**** Rebuild of configuration DLL for project JniCTest ****

**** Internal Builder is used for build               ****
g++ -IC:\Program Files\Java\jdk1.6.0_13\include -IC:\Program Files\Java\jdk1.6.0_13\include\win32 -O3 -Wall -c -fmessage-length=0 -mno-cygwin -D__int64=long long -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -oMain.o ..\Main.cpp
g++ -o libJniCTest.dll -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -shared -olibJniCTest.dll Main.o
Build complete for project JniCTest
Time consumed: 375  ms.  

Is there something wrong about the compiler options ? Thanks for any help.


回答1:


Solution found. The --kill-at option was not put in the right command. Indeed MinGW first compiles the files into an .o object file, then (second line) it does the linking from this .o file. The option must therefore be placed into the second line.

Corrected commands for a source file Main.cpp and an output DLL libJniCTest.dll :

g++ -I"C:\Program Files\Java\jdk1.6.0_13\include" -I"C:\Program Files\Java\jdk1.6.0_13\include\win32" -O0 -Wall -c -oMain.o ..\Main.cpp
g++ -Wl,--kill-at -shared -olibJniCTest.dll Main.o



回答2:


Also, don't forget to wrap your implementation like this

extern "C" {

//implemented methods

}

That took me hours to figure out




回答3:


I followed this simple JNI tutorial on IBM's site and compiled the given Sample1.c file with the following command on Windows XP. Its working fine for me.

gcc -Wall -Wl,--kill-at -shared Sample1.c -o Sample1.dll -I"C:\Program Files\Java\jdk1.7.0\include" -I"C:\Program Files\Java\jdk1.7.0\include\win32"

P.S: Change the JDK path as per your system.



来源:https://stackoverflow.com/questions/4850439/mingws-compiler-option-wl-kill-at-does-not-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!