如何将swift包编译为具有依赖项的.dylib?

2024-06-02 05:43:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

对于具有单个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?我是否缺少链接器命令


Tags: 项目函数pytestbuildprojectforlibrary
1条回答
网友
1楼 · 发布于 2024-06-02 05:43:26

在对swift buildswiftc变体进行了数小时的实验后,我发现了更简单的解决方案:

在清单中,将type设置为dynamic

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

swift build(无特殊参数)之后,可以在以下位置找到.dylib:

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

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

相关问题 更多 >