c++ SWIG typedef会跨模块边界创建冲突

erhoui1w  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(201)

我正在为stepcode库(https://github.com/stepcode/stepcode)编写一个C# Package 器,使用SWIG(版本4.1.1)作为生成器。该库是高度模块化的,因此在某些情况下,一个 Package 器模块必须知道另一个模块的声明。
假设我在本机库中得到了以下结构:

  • 模块1(clstepcore):此模块是提供类Registry和以下typedef的核心模块:
  1. typedef void ( * CF_init )( Registry & ); // pointer to creation initialization
  • 模块2(sdai_IFC4):该模块使用第一个模块的类型,因此SWIG提供了%import指令,以包含另一个模块描述文件,但不为该文件生成任何 Package 代码

(see:https://www.swig.org/Doc4.1/Preprocessor.html#Preprocessor_nn3)
代码如下所示:

clstepcore.i(为创建回调和注册表构造函数创建 Package 器)

  1. %module clstepcore
  2. %{
  3. #include "Registry.h"
  4. %}
  5. class Registry;
  6. typedef void ( * CF_init )( Registry & ); // pointer to creation initialization
  7. class Registry {
  8. public:
  9. Registry( CF_init initFunct );
  10. ~Registry();
  11. };

sdai_IFC4.i(为实际创建函数SchemaInit创建 Package )

  1. %module sdai_IFC4
  2. %{
  3. #include "schema.h"
  4. %}
  5. %import "clstepcore.i"
  6. %callback("%s_cb");
  7. void SchemaInit (Registry &);
  8. %nocallback;

不幸的是,为both模块生成的C#包含CF_init typedef的精确定义,这导致了两个程序集之间的冲突。
我已经尝试过%ignore之类的东西,但没有找到有效的解决方案。有没有人做过这样的东西,可以给我一个提示?先谢谢你了!

yvt65v4c

yvt65v4c1#

不能在两个模块之间共享类型。这意味着所有模块都必须有自己的Registry副本,并且这些副本在模块之间不兼容。
唯一的解决方案是在每个模块中重命名此类型:

  1. %rename(Registry_IFC4) Registry;

相关问题