从 .o 文件创建.dll文件时出现"Missing argument in parameter list"错误



我刚开始学习jni,并决定做一个你好的世界。我创建了一个helloworld java文件,其代码是

public class HelloWorld {
public native void displayHelloWorld();
static{
System.loadLibrary("hello");
}
public static void main(String[] args){
new HelloWorld().displayHelloWorld();
}

}

我编译了它,得到了下面的头文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     HelloWorld
* Method:    displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif

然后创建一个代码为的c文件

#include<jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){
printf("Hello World n");
return;
}

并对其进行编译以创建helloworld.o文件

现在,当我尝试使用命令创建.dll文件时

gcc -shared -o hello.dll HelloWorld.o -Wl,--add-stdcall-alias

我收到这个错误

At line:1 char:42
+ gcc -shared -o hello.dll HelloWorld.o -Wl,--add-stdcall-alias
+                                          ~
Missing argument in parameter list.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingArgument

我错过了什么?

问题是,在PowerShell中,逗号具有逗号运算符的特殊含义,而不像在Bash中,在这种上下文中,它没有任何特殊含义。解析命令时,-Wl被视为参数名称,,被解释为形成一个数组(参数列表(作为其参数。如链接文档中所示,除非在表达式模式中,否则,必须是二进制运算符,而对于命令调用,则使用参数模式。但是这个逗号没有剩余的参数,因此Missing argument in parameter list错误。

要解决此问题,您可以更改命令,通过使用其中一种类型的字符串将-Wl,--add-stdcall-alias设置为带引号的字符串,使PowerShell停止以特殊方式对,进行积分。对于我们的简单情况,任何字符串类型都可以,例如,对于单引号字符串,我们有:

gcc -shared -o hello.dll HelloWorld.o '-Wl,--add-stdcall-alias'

另一个选项是使用停止解析令牌--%:

gcc --% -shared -o hello.dll HelloWorld.o -Wl,--add-stdcall-alias

相关内容

最新更新