99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Swift調(diào)用C語(yǔ)言自建函數(shù)庫(kù)的方法

發(fā)布時(shí)間:2017-01-20 22:37  回復(fù):0  查看:2649   最后回復(fù):2017-01-20 22:37  

本程序示范了如何用Swift調(diào)用自定義C語(yǔ)言模塊的方法。一起來看看吧,希望對(duì)大家學(xué)習(xí)swift有所幫助。

  簡(jiǎn)介

  示范程序中有一個(gè)C語(yǔ)言的源程序CSwift.C和一個(gè)頭文件CSwift.h,我們的目標(biāo)是構(gòu)造一個(gè)CSwift的函數(shù)庫(kù),能夠讓swift源程序執(zhí)行CSwift程序中的函數(shù)。

  快速上手

  本程序需要Swift 3.0以上版本。

  下載、編譯和測(cè)試

  $ git clone https://github.com/RockfordWei/CSwift.git

  $ cd CSwift

  $ swift build

  $ ./build.lib.sh

  $ swift test

  源程序采用C語(yǔ)言寫成,測(cè)試程序則是Swift語(yǔ)言編寫。因此如果通過測(cè)試,則恭喜您,已經(jīng)成功實(shí)現(xiàn)了Swift語(yǔ)言調(diào)用C語(yǔ)言的整個(gè)過程。

  詳細(xì)步驟

  您可以完全不依賴所有上述內(nèi)容,而一步一步從零開始制作C函數(shù)庫(kù)和調(diào)用C庫(kù)的Swift代碼:

  構(gòu)造空白的函數(shù)庫(kù)

  仍然假定函數(shù)庫(kù)名稱為CSwift。首先找一個(gè)空白目錄,然后執(zhí)行:

  $ mkdir CSwift

  $ cd CSwift

  $ swift package init --type=system-module

  $ mkdir CSwift

  $ cd CSwift

  $ swift package init

  $ mv Tests ..

  $ cd ..

  $ rm -rf CSwift

  $ mkdir Sources

  細(xì)心的讀者會(huì)發(fā)現(xiàn),上面的bash 命令行在CSwift 文件夾下面建立了第二個(gè)CSwift文件夾,但是使用了不同的swift package了命令。第一個(gè)命令是創(chuàng)建swift空白項(xiàng)目,而且項(xiàng)目類型是系統(tǒng)模塊;而第二個(gè)命令是創(chuàng)建swift 空白項(xiàng)目,項(xiàng)目類型是函數(shù)庫(kù)。這種做法主要是為了能夠在同一個(gè)項(xiàng)目中用Swift去測(cè)試C語(yǔ)言的模塊。

  Module Map

  下一步是修理一下目標(biāo)的模塊映射表。請(qǐng)把module.modulemap修改為如下程序:

  module CSwift [system] {

  header "./Sources/CSwift.h"

  link "CSwift"

  export *

  }

  C模塊編程

  好了,現(xiàn)在請(qǐng)?jiān)?/span>Source文件夾下面建立兩個(gè)C語(yǔ)言文件:CSwift.cCSwift.h,內(nèi)容如下:

  Sources/CSwift.h

  extern int c_add(int, int);

  #define C_TEN 10

  Sources/CSwift.c

  int c_add(int a, int b) { return a + b ; }

  C模塊的編譯和庫(kù)函數(shù)鏈接

  上述步驟完成后,可以開始進(jìn)行C函數(shù)庫(kù)的編譯了。首先準(zhǔn)備一個(gè)編譯腳本build.lib.sh,內(nèi)容如下:

  build.lib.sh

  export LIB_BUILD=.build/debug

  cd Sources

  clang -c CSwift.c

  cd ..

  mv Sources/CSwift.o $LIB_BUILD

  ar -r $LIB_BUILD/libCSwift.a $LIB_BUILD/CSwift.o

  export LIB_BUILD=

  上面的程序首先把CSwift.cclang 編譯器(也就是swift的母編譯器)鏈接為一個(gè).o目標(biāo)文件,然后通過ar -r 命令鏈接為靜態(tài)函數(shù)庫(kù),關(guān)鍵是函數(shù)庫(kù)的位置一定要與swift 的目標(biāo)庫(kù)目錄路徑一致。

  如果您準(zhǔn)備發(fā)行,則用.build/release代替上面程序中的$LIB_BUILD變量。

  保存后執(zhí)行下列命令:

  $ cd CSwift

  $ chmod +x build.lib.sh

  $ swift build

  $ ./build.lib.sh

  到此為止,C語(yǔ)言函數(shù)庫(kù)就應(yīng)該準(zhǔn)備好了。

  Swift 程序調(diào)用

  請(qǐng)修改Tests/CSwiftTests/CSwiftTests.swift文件,內(nèi)容如下:

  import XCTest@testable

  import CSwift

  class CSwiftTests: XCTestCase {

  func testExample() {

  // 測(cè)試調(diào)用 函數(shù)

  let three = c_add(1, 2)

  XCTAssertEqual(three, 3)

  // 測(cè)試調(diào)用 語(yǔ)言的符號(hào)

  XCTAssertEqual(C_TEN, 10)

  }

  static var allTests : [(String, (CSwiftTests) -> () throws -> Void)] {

  return [

  ("testExample", testExample),

  ]

  }

  }

  測(cè)試

  最后一步最簡(jiǎn)單,直接執(zhí)行:

  $ swift test

  如果沒有問題,那就一切OK了!

  其他

  如果您在使用Xcode,則需要使用swift package generate-xcodeproj,但是需要調(diào)整上述build.lib.sh內(nèi)容的編譯目標(biāo)目錄,并配合Xcode偏好設(shè)置選擇匹配的目錄,否則無法測(cè)試。

 

來源:SegmentFault

您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?