如何将本地C库构建为静态库并与Swift链接?
正如标题所示,我从C代码创建静态库并将其用于Swift项目时遇到了一些问题 以下是C代码的生成过程:如何将本地C库构建为静态库并与Swift链接?,c,swift,linker,static-libraries,packaging,C,Swift,Linker,Static Libraries,Packaging,正如标题所示,我从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/lo
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
错误表明找不到库或库不可用(无法确定是哪个)
在libNuklear上运行nm
。a
显示:
libNuklear.a(test.o):
U _printf
0000000000000000 T _test_doit
看起来这些符号确实存在,所以我倾向于寻找要链接的库的可能性,所以我接下来将描述我的桥接过程。C代码放置在系统库模块/包中,与正在构建的可执行文件分离。它包含桥接头和包定义。以下是模块.modulemap
定义:
module CNuklear [system] {
header "Includes/CNuklear.h"
link "libNuklear"
export *
}
桥接头(CNuklear.h
):
我目前正在创建静态库,然后尝试构建swift可执行文件;但是,它在与我创建的静态库进行链接时遇到了问题。以下是我如何尝试在main.swift
中包含和执行代码:
import CNuklear
test_doit()
print("Hello, world!")
有没有一种方法可以进一步调试我正在使用的链接的问题?提前谢谢 在
模块.modulemap
文件中:
如果正在生成的静态库名为libNuklear.a
,则模块的链接
规范必须为:
module CNuklear [system] {
header "Includes/CNuklear.h"
link "Nuklear"
export *
}
您还必须使用
-Xlinker-L/usr/local/lib
或-Xlinker-L/dir/which/lib/residence运行swift build
,谢谢!这对我很有用
module CNuklear [system] {
header "Includes/CNuklear.h"
link "Nuklear"
export *
}