目前 Swig D 绑定(bind)使用以下符号 libfun
:
mixin(bindCode("libfun", "D_libfun"));
extern(C) int function(void* jarg1) libfun;
其中 D_libfun
符号在编译为库的 cxx 包装器中定义。因此,符号 libfun
被导出为 extern(C)
并且具有全局范围。我遇到过符号与现有 extern(C)
符号(例如 read)冲突的情况,导致模糊的运行时崩溃,我追溯到这个 swig 文件。
有没有办法:
- 避免引入 extern(C) 中间声明
- 或者,为这些符号添加用户指定的前缀或后缀(例如:
extern(C) mylib_libfun
),并将其反射(reflect)在主要和辅助包装器 d 文件中。
现在我需要对这些文件运行繁琐的后处理器,这很脆弱。
最佳答案
您建议的第二个解决方案是最简单的解决方案。您可以使用 SWIG's advanced renaming 执行此操作一次性完成。
例如给定函数:
void read();
我们可以用自动插入的 mylib_
前缀包装它:
%module test
%rename("mylib_%s") "";
void read();
关于c - 使用 extern(C) 的 swig D 绑定(bind)与现有的 extern(C) 函数冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12443610/