我按照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上)
有些打包程序會遺漏libcurses.so和libncurses.so之間的鏈接(您可以將鏈接參數更改爲「ncurses」以解決此問題)。 –
事實上,在下載最新的Swift快照(2015年12月21日)之前,我更改爲ncursesw,但當時仍然無法正常工作。 –