gpt4 book ai didi

java - SWIG 不在包装文件中声明全局变量

转载 作者:行者123 更新时间:2023-11-30 07:23:56 29 4
gpt4 key购买 nike

我正在使用 Cent OS、SWIG 1.3,并且我已经测试过从 SWIG 示例编译示例 Java 示例。它包括:

例子.c

/* A global variable */
double Foo = 3.0;

/* Compute the greatest common divisor of positive integers */
int gcd(int x, int y) {
int g;
g = y;
while (x > 0) {
g = x;
x = y % x;
y = g;
}
return g;
}

例子.i

%module example

extern int gcd(int x, int y);
extern double Foo;

然后我使用命令:

swig -java example.i

然后我用以下代码编译生成的 example_wrap.c:

gcc -c example_wrap.c -I/usr/java/jdk1.6.0_24/include -I/usr/java/jdk1.6.0_24/include/linux

我有以下错误:

example_wrap.c: In function ‘Java_exampleJNI_Foo_1set’:
example_wrap.c:201: error: ‘Foo’ undeclared (first use in this function)

example.i 文件是错误的还是我没有完成某些事情?或者这是 SWIG 中的错误?有解决方法吗?

最佳答案

您已告知 SWIG 将声明函数和全局变量,但您需要确保该声明在生成的包装器代码中可见。 (如果您没有 use a higher warning setting for gcc,您可能还会收到有关隐式声明 gcd 的警告)

解决方案是使该声明可见,最简单的方法是:

%module example

%{
// code here is passed straight to example_wrap.c unmodified
extern int gcd(int x, int y);
extern double Foo;
%}

// code here is wrapped:
extern int gcd(int x, int y);
extern double Foo;

我个人会添加一个包含这些声明的 example.h 文件,然后生成模块文件:

%module example

%{
// code here is passed straight to example_wrap.c unmodified
#include "example.h"
%}

// code here is wrapped:
%include "example.h"

在 example.c 中有相应的包含以达到良好的效果。

另一种写法是:

%module example

%inline %{
// Wrap and pass through to example_wrap.c simultaneously
extern int gcd(int x, int y);
extern double Foo;
%}

但通常我只推荐使用 %inline对于您要包装的内容特定于包装过程而不是您要包装的库的一般部分的情况。

关于java - SWIG 不在包装文件中声明全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11721429/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com