2015-12-22 39 views
1

我按照this page的说明编写了Curses包装模块。使用C库导入Swift模块

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

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

CCurses包含一个空Package.swift文件和含有

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

CursesWrapper一个module.modulemap文件包含含有Package.swift文件。

import PackageDescription 

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

和含有

import CCurses 

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

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

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

ModuleUsingCursesWrapper一个general.swift文件包含含有

import PackageDescription 

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

和含有main.swift文件一个文件Package.swift

import CursesWrapper 

startCurses() 
getchar() 
endCurses() 

运行时在ModuleUsingCursesWrapper宁迅速积累,我得到下面的输出:

 
Cloning Packages/CursesWrapper 
Cloning Packages/CCurses 
Compiling Swift Module 'CursesWrapper' (1 sources) 
Linking Library: .build/debug/CursesWrapper.a 
Compiling 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 failures 
swift-build: exit(1): [".../Swift/usr/bin/swift-build-tool", "-f", ".../ModuleUsingCursesWrapper/.build/debug/ModuleUsingCursesWrapper.o/llbuild.yaml"] 

看来,编译ModuleUsingCursesWrapper时,诅咒功能无法找到。我怎么解决这个问题 ?

(我在Linux上)

+0

有些打包程序会遗漏libcurses.so和libncurses.so之间的链接(您可以将链接参数更改为“ncurses”以解决此问题)。 –

+0

事实上,在下载最新的Swift快照(2015年12月21日)之前,我更改为ncursesw,但当时仍然无法正常工作。 –

回答

0

你的榜样玩了一段时间的Ubuntu 14.04框后,我遇到了同样的错误。经过一些额外的实验,我可以通过增加来解决它下面给main.swift

import CCurses 

Package.swift文件中使用的包装只引用CursesWrapper模块,但如果CCurses没有导入main.swift,那么未定义发生参考错误。

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

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