如何将单独Swift包中的C标题包含到另一个Swift包的C部分中

如何将单独Swift包中的C标题包含到另一个Swift包的C部分中,swift,Swift,我正在编写一个多平台的游戏引擎,以在Swift中获得乐趣。Swift软件包的基本布局如下所示: NativeTypes:一些C结构,比如向量、矩阵等等 引擎:包装一些NativeTypes以使em可用,加上引擎:基本上除了依赖于平台的代码之外的所有内容 PlatformImplementation:包含一个Swift目标实现引擎中的各种特定于平台的协议,以及一个C目标实现特定于平台的东西,如Vulkan渲染器等 理想情况下,我需要将NativeTypes头导入平台实现的C部分,这样我就可以从那里

我正在编写一个多平台的游戏引擎,以在Swift中获得乐趣。Swift软件包的基本布局如下所示:

  • NativeTypes:一些C结构,比如向量、矩阵等等
  • 引擎:包装一些NativeTypes以使em可用,加上引擎:基本上除了依赖于平台的代码之外的所有内容
  • PlatformImplementation:包含一个Swift目标实现引擎中的各种特定于平台的协议,以及一个C目标实现特定于平台的东西,如Vulkan渲染器等
  • 理想情况下,我需要将NativeTypes头导入平台实现的C部分,这样我就可以从那里获取类型并将它们直接输入到渲染器中。另一种方法是复制代码(需要精确对齐,等等),但这当然会很痛苦

    有什么办法可以做到这一点吗?

    我想出了一个(不太好的,不理想的!)解决方案,适用于任何有这个问题的人。诀窍是只保留所有包的本地依赖树,然后在C中解决它。实现:

    1。让需要在本地导入C头的包依赖于包含C头的包。这样我们可以保证稳定的文件夹结构:

        dependencies:[
        .package(path: "./NativeCodePackage"),
        .package(path: "./OtherPackage")
    ],
    
    2。在另一个包中,只需导航到第一个包,即可导入所需的标题,如:

        #define STR_IMPL(A) #A
    #define STR(A) STR_IMPL(A)
    
    #define NATIVEHEADERSDIR ../../../../../NativeCodePackage/Sources/NativeCodePackage/include
    
    #include STR(NATIVEHEADERDIR/Maths/Vector.h)
    
    3。最后,只需导入:

        #define STR_IMPL(A) #A
    #define STR(A) STR_IMPL(A)
    
    #define NATIVEHEADERSDIR ../../../../../NativeCodePackage/Sources/NativeCodePackage/include
    
    #include STR(NATIVEHEADERDIR/Maths/Vector.h)
    
    如果您希望看到此解决方案的有效实施,请查看我实施此解决方案的Swift engine项目: