正如标题所示,我在用C代码创建静态库并将其用于Swift项目时遇到了一些困难。
下面是C代码的生成过程:
make
# Making the static library
clang -c Sources/nuklear.c -o nuklear.o
clang -c Sources/test.c -o test.o
libtool -static nuklear.o test.o -o libNuklear.a
cp libNuklear.a /usr/local/lib
❯ ls /usr/local/lib | grep Nuk
libNuklear.a以下是错误:
swift build -Xlinker -L/usr/local/lib
'CNuklear' /Users/pprovins/Projects/CNuklearTest/.build/checkouts/CNuklear: warning: system packages are deprecated; use system library targets instead
ld: warning: Could not find or use auto-linked library 'libNuklear'
Undefined symbols for architecture x86_64:
"_test_doit", referenced from:
_main in main.swift.o
ld: symbol(s) not found for architecture x86_64
[0/1] Linking CNuklearTest此错误表示无法找到库或库不可用(无法确定哪个库)。
在nm上运行libNuklear.a显示:
libNuklear.a(test.o):
U _printf
0000000000000000 T _test_doit看来这些符号确实存在,所以我倾向于它可能是一个问题,找到图书馆的链接,所以我将描述我的桥接过程下。C代码被放置在与正在构建的可执行文件分开的系统库模块/包中。它包含一个桥接头和包定义。下面是module.modulemap的定义:
module CNuklear [system] {
header "Includes/CNuklear.h"
link "libNuklear"
export *
}桥接头(CNuklear.h):
#import "Includes/nuklear.h"
#import "Includes/test.h"目前,我创建了静态库,然后尝试构建快速可执行文件;但是,它在链接到我创建的静态库时遇到了问题。下面是我尝试在main.swift中包含和执行代码的方法
import CNuklear
test_doit()
print("Hello, world!")是否有办法进一步调试我正在进行的链接问题?提前感谢!
发布于 2020-11-22 19:08:22
在module.modulemap文件中:
如果正在构建的静态库名为libNuklear.a,则模块的link规范必须是:
module CNuklear [system] {
header "Includes/CNuklear.h"
link "Nuklear"
export *
}您还必须使用swift build或-Xlinker -L/dir/which/lib/resides运行-Xlinker -L/usr/local/lib。
https://stackoverflow.com/questions/64958357
复制相似问题