swig D绑定使用extern(C)冲突与现有的extern(C)函数

时间:2012-09-16 00:49:21

标签: c d swig extern

目前,Swig D绑定使用以下内容作为符号libfun

mixin(bindCode("libfun", "D_libfun"));
extern(C) int function(void* jarg1) libfun;

其中D_libfun符号在编译为库的cxx包装器中定义。因此,符号libfun将导出为extern(C)并具有全局范围。我遇到了符号与现有extern(C)符号发生冲突(例如读取)的情况,导致我追溯到此swig文件的模糊运行时崩溃。

有办法:

  • 避免引入extern(C)中间声明
  • 或者,为这些符号添加用户指定的前缀或后缀(例如:extern(C) mylib_libfun),并在主要和辅助包装文件中反映出来。

现在我需要在这些文件上运行一个繁琐的后处理器,这很脆弱。

1 个答案:

答案 0 :(得分:0)

您的第二个建议的解决方案是最简单的解决方案。您可以使用SWIG's advanced renaming一次完成所有操作。

例如给定函数:

void read();

我们可以使用自动插入的mylib_前缀来包装它:

%module test

%rename("mylib_%s") "";

void read();