c - 如何将本地 C 库构建为静态库并与 Swift 链接?
问题描述
正如标题所示,我在从 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"
我目前制作静态库,然后尝试构建 swift 可执行文件;但是,它无法链接到我制作的静态库。以下是我尝试在以下内容中包含和执行代码的方式main.swift
:
import CNuklear
test_doit()
print("Hello, world!")
有没有办法进一步调试我遇到的链接问题?提前致谢!
解决方案
在module.modulemap
文件中:
如果要构建的静态库名为libNuklear.a
,link
则模块的规范必须是:
module CNuklear [system] {
header "Includes/CNuklear.h"
link "Nuklear"
export *
}
您还必须swift build
使用-Xlinker -L/usr/local/lib
或运行-Xlinker -L/dir/which/lib/resides
推荐阅读
- python - Pandas - Some columns not working properly after groupby()
- windows - "An error occurred while trying to copy a file: The source file is corrupted."
- python - How to run the solution of the first exercise(string1.py) of google developers python course?
- python - 为什么这个猴子补丁不适用于蟒蛇?
- php - samesite session cookie setting - clarification on form post from another site
- tensorflow - 你什么时候想在 Tensorflow 中使用密集层和稀疏层?
- python - 我试图弄清楚如何根据python中的特定字符打印用户输入的字符串中的特定单词
- rx-java2 - 如何使用 RxBleAndroid 使用相同的连接收听通知并发送写操作?
- c++ - OpenCV 中“\0”的值
- amazon-web-services - AWS Step Function - 等待后重新执行步骤