SWIG 为 Director 生成的包装器代码中存在常量错误

发布于 2025-01-06 10:12:29 字数 1336 浏览 1 评论 0原文

因此,我尝试使用 swig 包装 C++ 库以对其进行 JNI 调用。但是,swig 为我创建的 _wrap.cxx 文件无法在 g++ 中干净地编译。我做错了什么?

这是一个简单的测试用例,它将重现该错误,以及其他几个不会出错的用例。我的头文件:

class MyClass {
};

class MyDirectored {
public:
  virtual void Overridable (MyClass const clz);
  virtual ~MyDirectored();
};

这是我的 .i 文件:

%module("directors="1") swigtest
%{
#include "swig.h"
%}

%feature("director") MyDirectored

%include "swig.h"

我正在尝试通过以下方式构建:

swig -c++ -package gen -java -outdir gen swig.i
g++ -c swig_wrap.cxx -o swig_wrap.o

并且 g++ 步骤产生以下错误:

swig_wrap.cxx: In member function 'virtual void SwigDirector_MyDirectored::Overridable(MyClass)':
swig_wrap.cxx:436: error: invalid conversion from 'const MyClass*' to 'MyClass*'

这似乎是一个合法的投诉 - 生成的 swig_wrap.cxx 文件看起来像(很多片段)

void SwigDirector_MyDirectored::Overridable (MyClass const clz) {
  //...
  jlong jclz;
  //...
  *((MyClass **)&jclz) = &clz; //Error on this line
  //...
}

我在 swig 2.0.4 和 1.3.40、Linux 和 Windows 中都遇到了相同的错误。有什么建议吗?我可以使用任何 g++ 技巧来忽略常量错误吗?

随机注释:我无法控制输入标头,因此更改函数签名是不行的。输入参数的类型(类或结构)似乎并不重要。将其设为常量引用而不是常量值参数可以通过导致 SWIG 显式放弃常量来“修复”错误(但同样,我无法更改输入标头)。

提前致谢!

So, I'm trying to use swig to wrap a c++ library to make JNI calls to it. But, the _wrap.cxx file that swig is creating for me won't compile cleanly in g++. What am I doing wrong?

Here's a simple test case that will reproduce the error, along with a couple of other cases that don't error. My header file:

class MyClass {
};

class MyDirectored {
public:
  virtual void Overridable (MyClass const clz);
  virtual ~MyDirectored();
};

and here's my .i file:

%module("directors="1") swigtest
%{
#include "swig.h"
%}

%feature("director") MyDirectored

%include "swig.h"

I'm attempting to build via the following:

swig -c++ -package gen -java -outdir gen swig.i
g++ -c swig_wrap.cxx -o swig_wrap.o

And the g++ step yields the following error:

swig_wrap.cxx: In member function 'virtual void SwigDirector_MyDirectored::Overridable(MyClass)':
swig_wrap.cxx:436: error: invalid conversion from 'const MyClass*' to 'MyClass*'

Which appears to be a legitimate complaint - the resulting swig_wrap.cxx file looks like (lots of snippage)

void SwigDirector_MyDirectored::Overridable (MyClass const clz) {
  //...
  jlong jclz;
  //...
  *((MyClass **)&jclz) = &clz; //Error on this line
  //...
}

I get the same error in both swig 2.0.4 and 1.3.40, Linux and Windows. Any suggestions? Any g++ trick I could use to ignore the constness error?

Random notes: I can't control the input header, so changing the function signature is a no-go. It doesn't appear to matter what type the input parameter is - class or struct. Making it a const reference instead of a const value parameter does "fix" the error by causing SWIG to explicitly cast away the constness (but again, I can't change the input header).

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文