问题描述
我正在尝试将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 build
和swiftc
变体之后,我发现了更简单的解决方案:
在清单中,将类型设置为动态。
.library(name: "TestPackage",type: .dynamic,targets: ["TestPackage"]),
在swift build
(无花哨的参数)之后,.dylib位于:
TestPackage/.build/x86_64-apple-macosx/debug/libTestPackage.dylib
现在我可以在Python中使用一些Swift软件包了!