首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将本地C库构建为静态库并与Swift链接?

如何将本地C库构建为静态库并与Swift链接?
EN

Stack Overflow用户
提问于 2020-11-22 19:08:22
回答 1查看 504关注 0票数 0

正如标题所示,我在用C代码创建静态库并将其用于Swift项目时遇到了一些困难。

下面是C代码的生成过程:

代码语言:javascript
复制
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

以下是错误:

代码语言:javascript
复制
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显示:

代码语言:javascript
复制
libNuklear.a(test.o):
                 U _printf
0000000000000000 T _test_doit

看来这些符号确实存在,所以我倾向于它可能是一个问题,找到图书馆的链接,所以我将描述我的桥接过程下。C代码被放置在与正在构建的可执行文件分开的系统库模块/包中。它包含一个桥接头和包定义。下面是module.modulemap的定义:

代码语言:javascript
复制
module CNuklear [system] {
  header "Includes/CNuklear.h"
  link "libNuklear"
  export *
}

桥接头(CNuklear.h):

代码语言:javascript
复制
#import "Includes/nuklear.h"
#import "Includes/test.h"

目前,我创建了静态库,然后尝试构建快速可执行文件;但是,它在链接到我创建的静态库时遇到了问题。下面是我尝试在main.swift中包含和执行代码的方法

代码语言:javascript
复制
import CNuklear

test_doit()

print("Hello, world!")

是否有办法进一步调试我正在进行的链接问题?提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2020-11-22 19:08:22

module.modulemap文件中:

如果正在构建的静态库名为libNuklear.a,则模块的link规范必须是:

代码语言:javascript
复制
module CNuklear [system] {
  header "Includes/CNuklear.h"
  link "Nuklear"
  export *
}

您还必须使用swift build-Xlinker -L/dir/which/lib/resides运行-Xlinker -L/usr/local/lib

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64958357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档