【问题标题】:How to build a local C library as a Static Library and link with Swift?如何将本地 C 库构建为静态库并与 Swift 链接?
【发布时间】:2020-11-22 19:08:22
【问题描述】:

正如标题所示,我在从 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.a 上运行nm 显示:

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!")

有没有办法进一步调试我遇到的链接问题?提前致谢!

【问题讨论】:

    标签: c swift linker static-libraries packaging


    【解决方案1】:

    module.modulemap 文件中:

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

    module CNuklear [system] {
      header "Includes/CNuklear.h"
      link "Nuklear"
      export *
    }
    

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

    【讨论】:

      猜你喜欢
      • 2014-09-26
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多