【问题标题】:Wrapping C code with SWIG that uses static global variables使用使用静态全局变量的 SWIG 包装 C 代码
【发布时间】:2016-05-19 20:03:13
【问题描述】:

我正在从嵌入式系统包装一些 C 代码以进行试验,使用 SWIG 并以 Python 为目标。这是简单的代码,我已经排除了硬件,一切都编译得很好。

我遇到的问题是我感兴趣的函数在 C 文件顶部定义的静态全局“上下文”变量上运行。我不知道如何让这个变量由模块实例化并由包装函数操作。

我制作了一些简单的测试文件来玩,如果我在模块中声明全局变量,它会出现在 cvar 中,但是应该在其主体中修改此变量的函数对 cvar 实例没有影响。

有什么方法可以在不修改我包装的 C 源文件的情况下完成这项工作?

【问题讨论】:

  • 如果你像这样改变它,它对我有用。 somelib.cvar.somevar = 4.0.
  • 对不起,你是对的。也不为我工作。您可以在 swig .i 文件中内联代码来设置变量,但这不是很优雅

标签: python c embedded global-variables swig


【解决方案1】:

这行得通

如果您在标头中声明常量 extern,则可以正常工作。

标题

/* test.h */
extern float g_float;
float getMe();

来源

/* test.cpp */
#include "test.h"
float g_float = 4.0;
float getMe() {
  return g_float;
}   

接口定义文件

/* test.i */
%module test
%{
#include "test.h"
%}

%include "test.h"

使用修改变量

import test
test.cvar.g_float = 4.5
test.getMe()

如果您在标头中声明并初始化了常量,则可以在接口定义文件中添加用于设置/获取它们和属性的内联函数。

静态类变量也可以使用,但这是使用类而不是 cvar 访问的。

【讨论】:

  • 谢谢,这行得通。事实证明,我包装的代码使用了一个静态上下文变量,我不能直接访问它,但它只包含指向更大结构成员的指针,我用 extern 声明了它,现在我可以访问上下文通过 cvar,并在其上调用包装的函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
相关资源
最近更新 更多