如何使用依赖项将swift软件包编译为.dylib?

问题描述

我正在尝试将Swift函数连接到Python。 Python可以解释@_cdecl中的任何.dylib函数

对于具有单个Swift源的项目目录:

project/
    test.swift
    test.py

我可以运行swiftc test.swift -emit-library生成.dylib文件

使用Swift软件包更高级,它看起来像这样:

project/
    TestPackage/
        ...
    test.py

在我的Swift软件包中,我可以将-emit-library参数传递给swift构建内的Swift编译器,例如:swift build -Xswiftc -emit-library。这会将我的包导出到.dylib。

我的问题是向程序包添加依赖项。我将SwifterSwift软件包添加为依赖项以进行测试,然后运行swift build -Xswiftc -emit-library。我收到此错误

swift build -Xswiftc -emit-library
Undefined symbols for architecture x86_64:
  "_$s10Foundation4DateV12SwifterSwiftE11weekOfMonthSivg",referenced from:
      _$s11TestPackage6swiftyyyF in TestPackage.swift.o
ld: symbol(s) not found for architecture x86_64
<unkNown>:0: error: link command Failed with exit code 1 (use -v to see invocation)

但是,看起来SwifterSwift成功导出了.dylib。但是我的主要项目TestPackage没有。 swift build确实可以单独工作,但没有达到我生成.dylib的目标。

问题:

我如何才能将整个程序包编译为具有依赖项的.dylib?我是否缺少链接器命令?

解决方法

在尝试了swift buildswiftc变体之后,我发现了更简单的解决方案:

在清单中,将类型设置为动态。

.library(name: "TestPackage",type: .dynamic,targets: ["TestPackage"]),

swift build(无花哨的参数)之后,.dylib位于:

TestPackage/.build/x86_64-apple-macosx/debug/libTestPackage.dylib

现在我可以在Python中使用一些Swift软件包了!