您需要向lli 介绍二进制文件的依赖关系。
以下是如何执行此操作。
假设有一个“hello world”程序:
// main.swift
print("hello")
将其编译为 LLVM Bitcode 和普通的可执行文件:
> swiftc main.swift -o hello
> swiftc -emit-bc main.swift -o hello.bc
如果您按原样通过lli 运行main.bc,那么您将遇到与您在程序中看到的类似的错误。
要了解依赖关系,您可以在 macOS 上使用 otool,在 Linux 上使用 ldd:
> otool -L /path/to/executbale
> ldd /path/to/executbale
以下是“hello world”程序的依赖项:
> otool -L ./hello
./hello:
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1450.15.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)
@rpath/libswiftCore.dylib (compatibility version 1.0.0, current version 900.0.74)
@rpath/libswiftSwiftOnoneSupport.dylib (compatibility version 1.0.0, current version 900.0.74)
在这种情况下,我们需要将libswiftSwiftOnoneSupport.dylib 和libswiftCore.dylib 传递给lli sing -load 选项。
在我的机器上,这些库位于此目录中(我使用find 找到它们):
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx
最后,您可以通过以下方式运行您的程序:
> lli \
-load=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftCore.dylib \
-load=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftSwiftOnoneSupport.dylib \
hello.bc
另外,请注意参数的顺序:位码文件放在最后很重要。