官方中文文档
https://kotlin.liying-cn.net/native-app-with-c-and-libcurl.html
实验环境:macOS - IDEA
一、安装 libcurl
brew install curl
配置环境变量:
echo 'export LDFLAGS="-L/usr/local/opt/curl/lib"' >> ~/.zshrc
echo 'export CPPFLAGS="-I/usr/local/opt/curl/include"' >> ~/.zshrc
使配置生效:
source ~/.zshrc
二、克隆仓库
git clone https://github.com/Kotlin/kmp-native-wizard
三、新建 libcurl.def 文件
-
在 src 文件夹下,选择 File | New | Directory 创建新目录。
-
将新目录命名为 nativeInterop/cinterop,这是 libcurl 头文件的默认位置。如果你选择了不同的位置,也可以在 build.gradle.kts 文件中做相应修改。
-
进入新建的子文件夹,使用 File | New | File 创建一个名为 libcurl.def 的文件,并将其内容更新为以下代码:
headers = curl/curl.h
headerFilter = curl/*
compilerOpts.linux = -I/usr/include -I/usr/include/x86_64-linux-gnu
linkerOpts.osx = -L/opt/local/lib -L/usr/local/opt/curl/lib -lcurl
linkerOpts.linux = -L/usr/lib/x86_64-linux-gnu -lcurl
四、修改 build.gradle.kts 文件
plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.kotlinxSerialization)
}
group = "me.user"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
kotlin {
val hostOs = System.getProperty("os.name")
val isArm64 = System.getProperty("os.arch") == "aarch64"
val isMingwX64 = hostOs.startsWith("Windows")
val nativeTarget = when {
hostOs == "Mac OS X" && isArm64 -> macosArm64("native")
hostOs == "Mac OS X" && !isArm64 -> macosX64("native")
hostOs == "Linux" && isArm64 -> linuxArm64("native")
hostOs == "Linux" && !isArm64 -> linuxX64("native")
isMingwX64 -> mingwX64("native")
else -> throw GradleException("Host OS is not supported in Kotlin/Native.")
}
nativeTarget.apply {
compilations.getByName("main") {
cinterops {
val libcurl by creating {
definitionFile.set(project.file("src/nativeInterop/cinterop/libcurl.def"))
packageName("libcurl")
compilerOpts("-I/usr/local/opt/curl/include") // 设置头文件路径
includeDirs.allHeaders("/usr/local/opt/curl/include") // 包含头文件目录
linkerOpts("-L/usr/local/opt/curl/lib") // 设置库文件路径
}
}
}
binaries {
executable {
entryPoint = "main"
}
}
}
sourceSets {
nativeMain.dependencies {
implementation(libs.kotlinxSerializationJson)
}
}
}
五、用 IDEA 打开这个项目的 main.kt 修改内容为
import kotlinx.cinterop.*
import libcurl.*
@OptIn(ExperimentalForeignApi::class)
fun main(args: Array) {
val curl = curl_easy_init()
if (curl != null) {
curl_easy_setopt(curl, CURLOPT_URL, "https://www.anyuer.club")
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L)
val res = curl_easy_perform(curl)
if (res != CURLE_OK) {
println("curl_easy_perform() failed ${curl_easy_strerror(res)?.toKString()}")
}
curl_easy_cleanup(curl)
}
}
这段代码等价于用 C 语言编写的代码,原理是通过调用 curl 库:
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://www.anyuer.club");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
return 0;
}
六、编译

七、运行
编译没有问题后,点击运行:
