gpt4 book ai didi

c - 使用 C 库导入 Swift 模块

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:19 25 4
gpt4 key购买 nike

我已经按照 this page 的说明编写了一个 Curses 包装器模块。 .

但是,我不知道如何使它在使用它的模块中正常工作。

我有 3 个并行目录:CCurses、CursesWrapper、ModuleUsingCursesWrapper。

CCurses 包含一个空的 Package.swift 文件和一个包含 module.modulemap 的文件

module CCurses [system] {
header "/usr/include/curses.h"
link "curses"
export *
}

CursesWrapper 包含一个 Package.swift 文件包含。

import PackageDescription

let package = Package(dependencies: [.Package(url: "../CCurses", majorVersion: 1)])

和一个包含

的general.swift文件
import CCurses

public func startCurses() -> Void{
initscr()}

public func getchar() -> Void{
getch()}

public func endCurses() -> Void{
endwin()}

ModuleUsingCursesWrapper 包含一个 Package.swift 文件包含

import PackageDescription

let package = dependencies: [.Package(url: "../CursesWrapper", majorVersion: 1)])

和一个包含

的main.swift文件
import CursesWrapper

startCurses()
getchar()
endCurses()

在 ModuleUsingCursesWrapper 中运行 swift build 时,我得到以下输出:

Cloning Packages/CursesWrapperCloning Packages/CCursesCompiling Swift Module 'CursesWrapper' (1 sources)Linking Library:  .build/debug/CursesWrapper.aCompiling Swift Module 'ModuleUsingCursesWrapper' (1 sources)Linking Executable:  .build/debug/ModuleUsingCursesWrapper.../ModuleUsingCursesWrapper/.build/debug/CursesWrapper.a(general.swift.o): In function `_TF14CursesWrapper11startCursesFT_T_':.../ModuleUsingCursesWrapper/Packages/CursesWrapper-1.0.0/general.swift:5: undefined reference to `initscr'.../ModuleUsingCursesWrapper/.build/debug/CursesWrapper.a(general.swift.o): In function `_TF1CursesWrapper7getcharFT_T_':.../ModuleUsingCursesWrapper/Packages/CursesWrapper-1.0.0/general.swift:8: undefined reference to `getch'.../ModuleUsingCursesWrapper/.build/debug/CursesWrapper.a(general.swift.o): In function `_TF14CursesWrapper9endCursesFT_T_':.../ModuleUsingCursesWrapper/Packages/CursesWrapper-1.0.0/general.swift:11: undefined reference to `endwin'clang: error: linker command failed with exit code 1 (use -v to see invocation)< unknown >:0: error: link command failed with exit code 1 (use -v to see invocation)< unknown :0: error: build had 1 command failuresswift-build: exit(1): [".../Swift/usr/bin/swift-build-tool", "-f", ".../ModuleUsingCursesWrapper/.build/debug/ModuleUsingCursesWrapper.o/llbuild.yaml"]

好像编译ModuleUsingCursesWrapper的时候找不到curses函数。我该如何解决这个问题?

(我在 Linux 上)

最佳答案

在 Ubuntu 14.04 机器上使用您的示例一段时间后,我遇到了同样的错误。经过一些额外的实验,我能够通过将以下内容添加到 main.swift 来解决它:

import CCurses

使用wrapper的模块的Package.swift文件只引用了CursesWrapper,但是如果CCurses没有导入main.swift,然后发生 undefined reference 错误。

从您提供的 swift.org 链接可以看出需要导入导入模块的依赖项,其中讨论了 JasPer/JPEG 示例。严格来说,JasPer 不是 JPEG 的包装器,而只是另一个系统模块,但思想是一样的:如果我们导入依赖于模块 B 的模块 A,那么我们也应该导入模块 B。

顺便说一句,我必须将 public func getchar() 更改为 public func getChar() 并相应地修改 main.swift。否则,在编译 main.swift 时,我会遇到 ambiguous use of 'getchar()' 错误。显然它已经在 CCurses 中定义了,这并不奇怪,因为它是一个标准的 C 函数。

关于c - 使用 C 库导入 Swift 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34421200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com