我使用命令创建了简单的 Swift 包
cd 桌面
mkdir AICore
cd AICore
swift package init --类型库
并将配置编辑为动态库配置,如下所示,
Package.Swift
// swift-tools-version: 5.6
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "AICore",
platforms: [.macOS(.v10_15)],
products: [
.library(name: "AICore", type: .dynamic, targets: ["AICore"]),
],
dependencies: [
],
targets: [
.target(
name: "AICore",
dependencies: [])
]
)
AICore.swift:
import Cocoa
public func launchMyAppKitWindow() {
let app = NSApplication.shared
let window = NSWindow(contentRect: NSRect(x: 0, y: 0, width: 400, height: 300), styleMask: [.titled, .closable, .resizable], backing: .buffered, defer: false)
window.center()
window.title = "My AppKit Window"
window.makeKeyAndOrderFront(nil)
app.run()
}
项目结构:
├── AICore
│ ├── Package.swift
│ ├── README.md
│ └── Sources
│ └── AICore
│ └── AICore.swift
└── Test
├── libAICore.dylib
└── main.py
我已经使用 swift build 编译了我的 swift 程序,并且取消隐藏了 AICore 父文件夹中的 hidden build 文件夹。图书馆位于
build->x86_64-apple-macosx->libAICore.dylib
我复制了库并粘贴到 Test 文件夹,其中包含以下要测试的 python 脚本。
import ctypes
# https://docs.python.org/3/library/ctypes.html
# Load the dylib
my_appkit_lib = ctypes.CDLL("/Users/YxT2/Desktop/PY/Test/libAICore.dylib")
# Call the launch function
my_appkit_lib.launchMyAppKitWindow()
我使用命令
python3 main.py
运行代码并收到以下错误
Traceback (most recent call last):
File "/Users/YxT2/Desktop/PY/Test/main.py", line 7, in <module>
my_appkit_lib.launchMyAppKitWindow()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/Cellar/[email protected]/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ctypes/__init__.py", line 389, in __getattr__
func = self.__getitem__(name)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/Cellar/[email protected]/3.11.3/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ctypes/__init__.py", line 394, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: dlsym(0x21db45be0, launchMyAppKitWindow): symbol not found
我测试了我的快速代码,它实际上启动了下面屏幕截图中显示的窗口。
但是我想使用这个测试库来Python代码调用
launchMyAppKitWindow
用Swift编写的函数,任何人都可以帮我解决这个问题吗?
import Cocoa
@_cdecl("launchMyAppKitWindow")
public func launchMyAppKitWindow() {
...
}
main.py - 检查库路径。
-- 这行错误 --
my_appkit_lib = ctypes.CDLL("/Users/YxT2/Desktop/PY/Test/libAICore.dylib")
OS X“lib sat.dylib”
swiftc -emit-library YOUR.swift