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

如何将本地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

正如标题所示,我从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
错误表明找不到库或库不可用(无法确定是哪个)

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 *
}