Kotlin Native實戰開發
17/100
發佈文章
xiangzhihong8html
注:本部份內容來源於《Kotlin入門與實戰》,預計9月上市。java
Kotlin Native是一種將Kotlin源碼編譯成不須要任何VM支持的目標平臺二進制數據的技術,編譯後的二進制數據能夠直接運行在目標平臺上,它主要包含一個基於LLVM的後端編譯器的和一個Kotlin本地運行時庫。設計Kotlin Native的目的是爲了支持在非JVM環境下進行編程,如在嵌入式平臺和iOS環境下,如此一來,Kotlin就能夠運行在非JVM平臺環境下。linux
LLVM是Low Level Virtual Machine的縮寫,是一種比較底層的虛擬機技術,LLVM由C++編寫而成,主要用來優化應用程序的編譯時間(compile-time)、連接時間(link-time)、運行時間(run-time)以及空閒時間(idle-time)。LLVM能夠有效的解決編譯器重複編譯代碼的問題,而且LLVM制定了LLVM IR這種中間代碼表示語言,LLVM IR充分考慮了各類應用場景,有效的提升了代碼的編譯效率。git
在講解Kotlin Native具體的知識以前,先來看一下計算機高級語言常見兩種流派:編譯型語言和解釋型語言。github
所謂編譯型語言,是指使用專門的編譯器、針對特定平臺/操做系統將某種高級語言源代碼一次性編譯成該平臺硬件可以執行的機器碼,編譯生成的可執行程序能夠脫離開發環境,在特定的平臺上獨立運行。由於編譯型語言是一次性編譯成機器碼的,因此能夠脫離開發環境獨立運行,並且一般運行效率較高。不過,正由於編譯型語言只能被編譯成特定平臺上的機器碼,因此生成的可執行程序一般沒法移植到其餘平臺上運行。例如,如今比較流行的C、C++等高級編程語言都屬於編譯型語言。shell
而所謂解釋型語言,是指使用專門的解釋器對源程序進行逐行解釋,並生成特定平臺的機器碼並當即執行的編程語言。解釋型語言一般不須要進行總體的編譯和連接處理,解釋型語言會把編譯型語言中的編譯和解釋過程混合在一塊兒執行。雖然解釋型語言運行效率較低且不能脫離釋器獨立運行,但解釋型語言能夠很方便的實現源程序的移植和運行。macos
目前,Kotlin Native主要提供了Mac、Linux和Windows三個主流平臺的編譯器,使用該編譯器能夠很輕鬆的編譯出運行在樹莓派、iOS、OS X、Windows以及Linux系統上的程序。Kotlin Native支持平臺和版本以下表所示。編程
支持的系統平臺 支持的版本 Windows x86_64 Linux x86_6四、arm3二、MIPS、MIPS小端 MacOS x86_64 iOS arm64 Android arm3二、arm64 WebAssembly wasm32
表16-1 Kotlin Native支持平臺及其版本後端
編譯Kotlin Native項目,首先須要到Github上下載Kotlin Native的編譯器軟件包,下載地址爲:https://github.com/JetBrains/...,使用前下載對應的平臺版本便可,下載後解壓下載的Kotlin Native編譯器軟件包,其目錄結構如圖16-1所示。
圖16-1 Kotlin Native編譯器目錄結構圖
固然,也能夠經過克隆Kotlin Native編譯器的源碼進行編譯,編譯須要先到Github上下載編譯器源碼,下載地址爲:https://github.com/JetBrains/...。下載完成後,使用以下命令下載依賴關係,命令以下:bash
./gradlew dependencies:update
而後,創建編譯器和庫的關聯。
./gradlew bundle
若是須要構建整個項目可能須要很長的時間。而後,使用如下的命令便可編譯項目。
./gradlew dist distPlatformLibs
到此,就能夠獲得Kotlin的Native編譯器了,它一般位於項目的./dist/bin目錄下,打開bin文件能夠看到Native編譯器的相關信息,它有7個可執行程序構成,如圖15-2所示。經過對比發現,Native編譯器的目錄結構和Kotlin Native官方提供的編譯器的內容是同樣的。而後,就能夠利用Native編譯器編譯應用程序了。例如:
export PATH=./dist/bin:$PATH kotlinc hello.kt -o hello
若是須要進行優化編譯,可使用-opt參數。
kotlinc hello.kt -o hello -opt
若是須要對應用程序進行測試,可使用相似於下面的命令。
./gradlew backend.native:tests:run
圖16-2 Kotlin的Native編譯器目錄結構
在Kotlin Native官方提供的示例中,系統自帶了針對不一樣平臺的例子,而且這些例子都是能夠直接編譯運行的。因爲Kotlin Native自己是一個gradle構建的項目,因此可使用idea直接打開Kotlin Native目錄下的samples文件,idea會自動識別該項目。
打開kotlin-native-macos-0.6文件,其目錄結構如圖15-3所示。其中,bin目錄包含衆多的與Kotlin Native相關的執行命令,klib目錄則主要包含Kotlin的標準庫的關聯元數據文件以及針對各個目標平臺的bc文件,konan主要包含編譯器依賴的一些jar包和一些已經編譯好的項目實例,可使用IntelliJ IDEA直接導入。
圖16-3 編譯器konan目錄結構
打開Kotlin Native編譯器的bin目錄能夠發現,bin文件主要由cinterop、jsinterop、klib、konanc、kotlinc、kotlinc-native、run_konan等7個可執行文件組成。其中,run_konan是編譯器真正的入口,源碼以下。
TOOL_NAME="$1" shift if [ -z "$JAVACMD" -a -n "$JAVA_HOME" -a -x "$JAVA_HOME/bin/java" ]; then JAVACMD="$JAVA_HOME/bin/java" else JAVACMD=java fi [ -n "$JAVACMD" ] || JAVACMD=java //省略部分代碼 LIBCLANG_DISABLE_CRASH_RECOVERY=1 \ $TIMECMD "$JAVACMD" "${java_opts[@]}" "${java_args[@]}" -cp "$KONAN_CLASSPATH" "$TOOL_CLASS" "$TOOL_NAME" "${konan_args[@]}"
能夠發現,Kotlin Native編譯器konan的運行環境仍是須要JVM環境支持的,可是它生成的機器碼的可執行程序是不須要JVM環境支持的,能夠直接運行在對應的平臺系統上。
首先,在IDEA中依次選擇【File】→【New】→【Project】建立一個普通的 Gradle工程。
圖16-4 建立Gradle工程
建立完成以後,須要修改build.gradle文件配置。打開build.gradle文件並添加以下配置。
buildscript { repositories { mavenCentral() maven { url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies" } } dependencies { classpath "org.jetbrains.kotlin:kotlin-native-gradle-plugin:0.5" } } apply plugin: 'konan'
其中,kotlin-native-gradle-plugin:0.5是Gradle構建Kotlin Native工程所使用的DSL插件,這個插件發佈在https://dl.bintray.com/jetbra...。除此以外,還須要應用konan插件,konan插件是用來將Kotlin代碼編譯爲native代碼的插件,能夠經過以下地址來獲取更多konan相關的信息。
https://github.com/JetBrains/kotlin-native/blob/master/GRADLE_PLUGIN.md
此時,還須要建立一個kotliner.def文件,該文件主要用來配置C源碼到Kotlin的映射關係。
headers=cn_kotliner.h
接下來,在工程的src目錄下新建一個c目錄,此目錄專門用來存放C代碼。首先,建立兩個c文件:cn_kotliner.h和cn_kotliner.c。其中,C頭文件聲明的代碼以下。
#ifndef CN_KOTLINER_H #define CN_KOTLINER_H void printHello(); int factorial(int n); #endif
在上面的代碼中,主要聲明瞭兩個函數,打印HelloWorld的 printHello函數和用來計算階乘的factorial函數。cn_kotlinor.c的源代碼以下:
#include "cn_kotliner.h" #include <stdio.h> void printHello(){ printf("[C]HelloWorld\n"); } int factorial(int n){ printf("[C]calc factorial: %d\n", n); if(n == 0) return 1; return n * factorial(n - 1); }
接下來,還須要建立一個kotlin文件,該文件主要是調用C層的代碼,實現跨平臺調用。該文件的源碼以下:
import kotliner.* fun main(args: Array<String>) { printHello() (1..5).map(::factorial).forEach(::println) }
其中,導入的kotlinor.*包是C語言代碼通過clang編譯後對應的C接口的包路徑,能夠在項目的build.gradle配置文件中的konanInterop中配置這個路徑。
圖16-5 Kotlin Native項目目錄結構圖
接下來,還須要添加konanInterop和konanArtifacts相關的配置信息。其中,konanInterop主要用來配置Kotlin調用C的接口。相關的源碼以下:
konanInterop { ckotlinor { defFile 'kotlinor.def' // interop配置文件 includeDirs "src/c" // C頭文件目錄,能夠傳入多個 } }
在上面的配置文件中,ckotlinor是插件中的KonanInteropConfig對象,在konanArtifacts配置中會引用這個ckotlinor。而kotlinor.def是Kotlin Native與C 語言互操做的配置文件,能夠在kotlinor.def裏面配置C源碼到Kotlin的映射關係,該配置文件的內容以下。
headers=cn_kotlinor.h compilerOpts=-Isrc/c
除此上面使用的選項以外,konanInterop還提供了以下經常使用的選項。
konanInterop { pkgName { defFile <def-file> pkg <package with stubs> target <target: linux/macbook/iphone/iphone_sim> compilerOpts <Options for native stubs compilation> linkerOpts <Options for native stubs > headers <headers to process> includeDirs <directories where headers are located> linkFiles <files which will be linked with native stubs> dumpParameters <Option to print parameters of task before execution> } }
konanInterop配置參數選項對應的具體含義以下表所示。
配置選項 選項說明 defFile 互操做映射關係配置文件 pkg C頭文件編譯後映射爲Kotlin的包名 target 編譯目標平臺:linux/macbook/iphone等 compilerOpts 編譯選項 linkerOpts 連接選項 headers 須要處理的頭文件 includeDirs 包括頭文件的目錄 linkFiles 與native stubs連接的文件 dumpParameters 打印Gradle任務參數的選項配置
表16-2 konanInterop配置選項說明表
接下來,須要爲項目添加konanArtifacts相關的配置,該配置主要用來處理編譯任務的執行。
konanArtifacts { KotlinorClient { inputFiles fileTree("src/kotlin") //kotlin代碼配置,項目入口main() useInterop 'ckotlinor' //前面的interop配置 nativeLibrary fileTree('src/c/cn_kotlinor.bc') //本地庫文件配置 target 'macbook' // 編譯的目標平臺 } }
konan編譯任務配置的處理類是KonanCompileTask.kt,能夠在Kotlin Native的kotlin-native-gradle-plugin插件中找到該類。能夠經過如下地址來獲取更詳細的konan插件配置信息。
https://github.com/JetBrains/kotlin-native/blob/master/GRADLE_PLUGIN.md
接下來,在項目的src/c目錄下面,用命令行編譯上面的代碼,命令以下。
clang -std=c99 -c cn_kotliner.c -o cn_kotliner.bc -emit-llvm
其中,clang是一個由C++編寫的基於LLVM的C/C++/Objective-C/Objective-C++編譯器。若是提示找不到clang命令,能夠在編譯器的dependencies目錄中找到相關的內容。固然,還可使用shell腳本(名稱爲kclang.sh)來簡化clang編譯的命令行輸入參數。
#!/usr/bin/env bash clang -std=c99 -c $1 -o $2 -emit-llvm
接着把kclang.sh放到C代碼目錄下,而後使用腳原本編譯C代碼。例如:
kclang.sh cn_kotlinor.c cn_kotlinor.bc
經過上面的命令編譯以後,將獲得一個名爲cn_kotlinor.bc的庫文件。最後,在執行Gradle構建以前,還須要指定konan編譯器主目錄。具體的,在工程根目錄下面新建一個gradle.properties屬性配置文件,該文件格式以下。
konan.home=<編譯器路徑>
例如:
konan.home=/Users/xiangzhihong /kotlin native/kotlin-native-macos-0.5
固然,也能夠不添加gradle.properties配置文件,那樣的話,只須要在編譯的時候使用本地的編譯器便可。
而後,在IDEA的Gradle工具欄依次點擊【Tasks】→【build】執行構建操做,如圖15-5所示。等待項目構建完成,會在項目的build/konan/bin/目錄下面生成一個KotlinorClient.kexe的可執行程序,它能夠直接運行在Mac OS系統上而再也不須要依賴JVM環境。
圖16-5 使用Gradle工具欄編譯項目
而後,在命令行中執行KotlinorApp.kexe命令,便可看到輸出結果,對應的命令以下。
build/konan/bin/KotlinorApp.kexe
能夠看到,做爲一款致力於跨平臺開發的編程語言,Kotlin Native很是注重語言平臺的互操做性,能夠說,使用Kotlin Native進行跨平臺開發優點是很是明顯的。
對於Kotlin Native項目來講,除了容許Gradle方式構建編譯外,還可使用命令行的方式來編譯項目。具體來講,編寫完Kotlin源碼以後,採用shell腳本的方式來構建,或者使用Makefile或build.sh的方式來構建,官方推薦使用shell腳本構建方式,本篇採用與之相似的Makefile腳本方式。例如:
build : src/kotlin/main.kt kotliner.kt.bc konanc src/kotlin/main.kt -library build/kotliner/kotliner.kt.bc -nativelibrary build/kotliner/cn_kotliner.bc -o build/kotliner/kotliner.kexe kotliner.kt.bc : kotliner.bc kotliner.def cinterop -def ./kotliner.def -o build/kotliner/kotliner.kt.bc kotliner.bc : src/c/cn_kotliner.c src/c/cn_kotliner.h mkdir -p build/kotliner clang -std=c99 -c src/c/cn_kotliner.c -o build/kotliner/cn_kotliner.bc -emit-llvm clean: rm -rf build/kotliner
採用命令行方式編譯Kotlin Native時,須要先把編譯器<konan.home>/bin
目錄加入系統的path環境中,而後再執行make命令,編譯完成以後就能夠在項目的build/kotliner目錄中找到kotliner.kexe文件。
圖書連接:Kotlin入門與實戰
注:本部份內容來源於《Kotlin入門與實戰》,預計9月上市。
16.1 Kotlin Native
16.1.1 Kotlin Native簡介
Kotlin Native是一種將Kotlin源碼編譯成不須要任何VM支持的目標平臺二進制數據的技術,編譯後的二進制數據能夠直接運行在目標平臺上,它主要包含一個基於LLVM的後端編譯器的和一個Kotlin本地運行時庫。設計Kotlin Native的目的是爲了支持在非JVM環境下進行編程,如在嵌入式平臺和iOS環境下,如此一來,Kotlin就能夠運行在非JVM平臺環境下。
LLVM是Low Level Virtual Machine的縮寫,是一種比較底層的虛擬機技術,LLVM由C++編寫而成,主要用來優化應用程序的編譯時間(compile-time)、連接時間(link-time)、運行時間(run-time)以及空閒時間(idle-time)。LLVM能夠有效的解決編譯器重複編譯代碼的問題,而且LLVM制定了LLVM IR這種中間代碼表示語言,LLVM IR充分考慮了各類應用場景,有效的提升了代碼的編譯效率。
在講解Kotlin Native具體的知識以前,先來看一下計算機高級語言常見兩種流派:編譯型語言和解釋型語言。
所謂編譯型語言,是指使用專門的編譯器、針對特定平臺/操做系統將某種高級語言源代碼一次性編譯成該平臺硬件可以執行的機器碼,編譯生成的可執行程序能夠脫離開發環境,在特定的平臺上獨立運行。由於編譯型語言是一次性編譯成機器碼的,因此能夠脫離開發環境獨立運行,並且一般運行效率較高。不過,正由於編譯型語言只能被編譯成特定平臺上的機器碼,因此生成的可執行程序一般沒法移植到其餘平臺上運行。例如,如今比較流行的C、C++等高級編程語言都屬於編譯型語言。
而所謂解釋型語言,是指使用專門的解釋器對源程序進行逐行解釋,並生成特定平臺的機器碼並當即執行的編程語言。解釋型語言一般不須要進行總體的編譯和連接處理,解釋型語言會把編譯型語言中的編譯和解釋過程混合在一塊兒執行。雖然解釋型語言運行效率較低且不能脫離釋器獨立運行,但解釋型語言能夠很方便的實現源程序的移植和運行。
目前,Kotlin Native主要提供了Mac、Linux和Windows三個主流平臺的編譯器,使用該編譯器能夠很輕鬆的編譯出運行在樹莓派、iOS、OS X、Windows以及Linux系統上的程序。Kotlin Native支持平臺和版本以下表所示。
支持的系統平臺 支持的版本
Windows x86_64
Linux x86_6四、arm3二、MIPS、MIPS小端
MacOS x86_64
iOS arm64
Android arm3二、arm64
WebAssembly wasm32
表16-1 Kotlin Native支持平臺及其版本
編譯Kotlin Native項目,首先須要到Github上下載Kotlin Native的編譯器軟件包,下載地址爲:https://github.com/JetBrains/...,使用前下載對應的平臺版本便可,下載後解壓下載的Kotlin Native編譯器軟件包,其目錄結構如圖16-1所示。
這裏寫圖片描述
圖16-1 Kotlin Native編譯器目錄結構圖
固然,也能夠經過克隆Kotlin Native編譯器的源碼進行編譯,編譯須要先到Github上下載編譯器源碼,下載地址爲:https://github.com/JetBrains/...。下載完成後,使用以下命令下載依賴關係,命令以下:
./gradlew dependencies:update
而後,創建編譯器和庫的關聯。
./gradlew bundle
若是須要構建整個項目可能須要很長的時間。而後,使用如下的命令便可編譯項目。
./gradlew dist distPlatformLibs
到此,就能夠獲得Kotlin的Native編譯器了,它一般位於項目的./dist/bin目錄下,打開bin文件能夠看到Native編譯器的相關信息,它有7個可執行程序構成,如圖15-2所示。經過對比發現,Native編譯器的目錄結構和Kotlin Native官方提供的編譯器的內容是同樣的。而後,就能夠利用Native編譯器編譯應用程序了。例如:
export PATH=./dist/bin:$PATH
kotlinc hello.kt -o hello
若是須要進行優化編譯,可使用-opt參數。
kotlinc hello.kt -o hello -opt
若是須要對應用程序進行測試,可使用相似於下面的命令。
./gradlew backend.native:tests:run
這裏寫圖片描述
圖16-2 Kotlin的Native編譯器目錄結構
在Kotlin Native官方提供的示例中,系統自帶了針對不一樣平臺的例子,而且這些例子都是能夠直接編譯運行的。因爲Kotlin Native自己是一個gradle構建的項目,因此可使用idea直接打開Kotlin Native目錄下的samples文件,idea會自動識別該項目。
打開kotlin-native-macos-0.6文件,其目錄結構如圖15-3所示。其中,bin目錄包含衆多的與Kotlin Native相關的執行命令,klib目錄則主要包含Kotlin的標準庫的關聯元數據文件以及針對各個目標平臺的bc文件,konan主要包含編譯器依賴的一些jar包和一些已經編譯好的項目實例,可使用IntelliJ IDEA直接導入。
這裏寫圖片描述
圖16-3 編譯器konan目錄結構
打開Kotlin Native編譯器的bin目錄能夠發現,bin文件主要由cinterop、jsinterop、klib、konanc、kotlinc、kotlinc-native、run_konan等7個可執行文件組成。其中,run_konan是編譯器真正的入口,源碼以下。
TOOL_NAME="$1"
shift
if [ -z "$JAVACMD" -a -n "$JAVA_HOME" -a -x "$JAVA_HOME/bin/java" ]; then
JAVACMD="$JAVA_HOME/bin/java"
else
JAVACMD=java
fi
[ -n "$JAVACMD" ] || JAVACMD=java
//省略部分代碼
LIBCLANG_DISABLE_CRASH_RECOVERY=1 \
$TIMECMD "$JAVACMD" "${java_opts[@]}" "${java_args[@]}" -cp "$KONAN_CLASSPATH" "$TOOL_CLASS" "$TOOL_NAME" "${konan_args[@]}"
能夠發現,Kotlin Native編譯器konan的運行環境仍是須要JVM環境支持的,可是它生成的機器碼的可執行程序是不須要JVM環境支持的,能夠直接運行在對應的平臺系統上。
16.2 Kotlin Native實例
首先,在IDEA中依次選擇【File】→【New】→【Project】建立一個普通的 Gradle工程。
這裏寫圖片描述
圖16-4 建立Gradle工程
建立完成以後,須要修改build.gradle文件配置。打開build.gradle文件並添加以下配置。
buildscript {
repositories { mavenCentral() maven { url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies" } } dependencies { classpath "org.jetbrains.kotlin:kotlin-native-gradle-plugin:0.5" }
}
apply plugin: 'konan'
其中,kotlin-native-gradle-plugin:0.5是Gradle構建Kotlin Native工程所使用的DSL插件,這個插件發佈在https://dl.bintray.com/jetbra...。除此以外,還須要應用konan插件,konan插件是用來將Kotlin代碼編譯爲native代碼的插件,能夠經過以下地址來獲取更多konan相關的信息。
https://github.com/JetBrains/...
此時,還須要建立一個kotliner.def文件,該文件主要用來配置C源碼到Kotlin的映射關係。
headers=cn_kotliner.h
接下來,在工程的src目錄下新建一個c目錄,此目錄專門用來存放C代碼。首先,建立兩個c文件:cn_kotliner.h和cn_kotliner.c。其中,C頭文件聲明的代碼以下。
void printHello();
int factorial(int n);
在上面的代碼中,主要聲明瞭兩個函數,打印HelloWorld的 printHello函數和用來計算階乘的factorial函數。cn_kotlinor.c的源代碼以下:
void printHello(){
printf("[C]HelloWorld\n");
}
int factorial(int n){
printf("[C]calc factorial: %d\n", n); if(n == 0) return 1; return n * factorial(n - 1);
}
接下來,還須要建立一個kotlin文件,該文件主要是調用C層的代碼,實現跨平臺調用。該文件的源碼以下:
import kotliner.*
fun main(args: Array<String>) {
printHello() (1..5).map(::factorial).forEach(::println)
}
其中,導入的kotlinor.*包是C語言代碼通過clang編譯後對應的C接口的包路徑,能夠在項目的build.gradle配置文件中的konanInterop中配置這個路徑。
這裏寫圖片描述
圖16-5 Kotlin Native項目目錄結構圖
接下來,還須要添加konanInterop和konanArtifacts相關的配置信息。其中,konanInterop主要用來配置Kotlin調用C的接口。相關的源碼以下:
konanInterop {
ckotlinor { defFile 'kotlinor.def' // interop配置文件 includeDirs "src/c" // C頭文件目錄,能夠傳入多個 }
}
在上面的配置文件中,ckotlinor是插件中的KonanInteropConfig對象,在konanArtifacts配置中會引用這個ckotlinor。而kotlinor.def是Kotlin Native與C 語言互操做的配置文件,能夠在kotlinor.def裏面配置C源碼到Kotlin的映射關係,該配置文件的內容以下。
headers=cn_kotlinor.h
compilerOpts=-Isrc/c
除此上面使用的選項以外,konanInterop還提供了以下經常使用的選項。
konanInterop {
pkgName { defFile <def-file> pkg <package with stubs> target <target: linux/macbook/iphone/iphone_sim> compilerOpts <Options for native stubs compilation> linkerOpts <Options for native stubs > headers <headers to process> includeDirs <directories where headers are located> linkFiles <files which will be linked with native stubs> dumpParameters <Option to print parameters of task before execution> }
}
konanInterop配置參數選項對應的具體含義以下表所示。
配置選項 選項說明
defFile 互操做映射關係配置文件
pkg C頭文件編譯後映射爲Kotlin的包名
target 編譯目標平臺:linux/macbook/iphone等
compilerOpts 編譯選項
linkerOpts 連接選項
headers 須要處理的頭文件
includeDirs 包括頭文件的目錄
linkFiles 與native stubs連接的文件
dumpParameters 打印Gradle任務參數的選項配置
表16-2 konanInterop配置選項說明表
接下來,須要爲項目添加konanArtifacts相關的配置,該配置主要用來處理編譯任務的執行。
konanArtifacts {
KotlinorClient { inputFiles fileTree("src/kotlin") //kotlin代碼配置,項目入口main() useInterop 'ckotlinor' //前面的interop配置 nativeLibrary fileTree('src/c/cn_kotlinor.bc') //本地庫文件配置 target 'macbook' // 編譯的目標平臺 }
}
konan編譯任務配置的處理類是KonanCompileTask.kt,能夠在Kotlin Native的kotlin-native-gradle-plugin插件中找到該類。能夠經過如下地址來獲取更詳細的konan插件配置信息。
https://github.com/JetBrains/...
16.2.5 編譯與執行
接下來,在項目的src/c目錄下面,用命令行編譯上面的代碼,命令以下。
clang -std=c99 -c cn_kotliner.c -o cn_kotliner.bc -emit-llvm
其中,clang是一個由C++編寫的基於LLVM的C/C++/Objective-C/Objective-C++編譯器。若是提示找不到clang命令,能夠在編譯器的dependencies目錄中找到相關的內容。固然,還可使用shell腳本(名稱爲kclang.sh)來簡化clang編譯的命令行輸入參數。
接着把kclang.sh放到C代碼目錄下,而後使用腳原本編譯C代碼。例如:
kclang.sh cn_kotlinor.c cn_kotlinor.bc
經過上面的命令編譯以後,將獲得一個名爲cn_kotlinor.bc的庫文件。最後,在執行Gradle構建以前,還須要指定konan編譯器主目錄。具體的,在工程根目錄下面新建一個gradle.properties屬性配置文件,該文件格式以下。
konan.home=<編譯器路徑>
例如:
konan.home=/Users/xiangzhihong /kotlin native/kotlin-native-macos-0.5
固然,也能夠不添加gradle.properties配置文件,那樣的話,只須要在編譯的時候使用本地的編譯器便可。
而後,在IDEA的Gradle工具欄依次點擊【Tasks】→【build】執行構建操做,如圖15-5所示。等待項目構建完成,會在項目的build/konan/bin/目錄下面生成一個KotlinorClient.kexe的可執行程序,它能夠直接運行在Mac OS系統上而再也不須要依賴JVM環境。
這裏寫圖片描述
圖16-5 使用Gradle工具欄編譯項目
而後,在命令行中執行KotlinorApp.kexe命令,便可看到輸出結果,對應的命令以下。
build/konan/bin/KotlinorApp.kexe
能夠看到,做爲一款致力於跨平臺開發的編程語言,Kotlin Native很是注重語言平臺的互操做性,能夠說,使用Kotlin Native進行跨平臺開發優點是很是明顯的。
16.2.6 命令行方式編譯Kotlin Native
對於Kotlin Native項目來講,除了容許Gradle方式構建編譯外,還可使用命令行的方式來編譯項目。具體來講,編寫完Kotlin源碼以後,採用shell腳本的方式來構建,或者使用Makefile或build.sh的方式來構建,官方推薦使用shell腳本構建方式,本篇採用與之相似的Makefile腳本方式。例如:
build : src/kotlin/main.kt kotliner.kt.bc
konanc src/kotlin/main.kt -library build/kotliner/kotliner.kt.bc -nativelibrary build/kotliner/cn_kotliner.bc -o build/kotliner/kotliner.kexe
kotliner.kt.bc : kotliner.bc kotliner.def
cinterop -def ./kotliner.def -o build/kotliner/kotliner.kt.bc
kotliner.bc : src/c/cn_kotliner.c src/c/cn_kotliner.h
mkdir -p build/kotliner clang -std=c99 -c src/c/cn_kotliner.c -o build/kotliner/cn_kotliner.bc -emit-llvm
clean:
rm -rf build/kotliner
採用命令行方式編譯Kotlin Native時,須要先把編譯器<konan.home>/bin目錄加入系統的path環境中,而後再執行make命令,編譯完成以後就能夠在項目的build/kotliner目錄中找到kotliner.kexe文件。
在這裏插入圖片描述
圖書連接:Kotlin入門與實戰
Markdown 已選中 8144 字數 306 行數 當前行 306, 當前列 56 HTML 7545 字數 177 段落