2015-12-22 35 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函數。