当前位置: 首页 > news >正文

Kotlin Native调用C curl

官方中文文档

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 文件

1. 在 src 文件夹下,选择 File | New | Directory 创建新目录。

2. 将新目录命名为 nativeInterop/cinterop,这是 libcurl 头文件的默认位置。如果你选择了不同的位置,也可以在 build.gradle.kts 文件中做相应修改。

3. 进入新建的子文件夹,使用 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;
}

六、编译

编译截图

七、运行

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

运行截图

http://www.lryc.cn/news/612089.html

相关文章:

  • Uniapp生物识别(SOTER)
  • 【第5话:相机模型1】针孔相机、鱼眼相机模型的介绍及其在自动驾驶中的作用及使用方法
  • 第二十六天(数据结构:树(补充版程序请看下一篇))
  • 数字图像处理(冈萨雷斯)第三版:第四章——空间滤波与频域滤波(平滑与锐化)——主要内容和重点
  • 【PHP 抽象类完全指南(含 PHP 8.4 新特性)】
  • 02.【数据结构-C语言】顺序表(线性表概念、顺序表实现:增删查、前向声明、顺序表实现通讯录项目:增删改查、通讯录数据导入及保存到本地文件)
  • Linux操作系统启动项相关研究与总结
  • Redis面试精讲 Day 12:Redis Sentinel哨兵机制详解
  • 深度学习(pytorch版)前言:环境安装和书籍框架介绍
  • 单变量单步时序预测:CNN-GRU卷积神经网络结合门控循环单元
  • Linux系统编程——环境变量、命令行参数
  • mysql8.0主从节点克隆
  • Numpy科学计算与数据分析:Numpy入门之多平台安装与基础环境配置
  • 用NAS如何远程访问:详细教程与实用技巧
  • 强强联合:OpenAI正式登陆AWS!
  • 【motion】标签体系设计与检索 1:HumanML3D 和 KIT Motion-Language(KITML)
  • 《Vue 3与Element Plus构建多语后台的深层架构》
  • 导入Excel打印
  • GEAR:一种高效的 KV Cache 压缩方法,用于几乎无损的大语言模型生成式推理
  • 云手机对于网络游戏的作用
  • linux下的串口通信原理及编程实例
  • 【完整源码+数据集+部署教程】耳镜耳部疾病分类系统源码和数据集:改进yolo11-HSFPN
  • Centos 安装 redis
  • 理解生成统一模型技术调研报告
  • 北京-4年功能测试2年空窗-报培训班学测开-第六十九天-投简历第一天-从兴奋到害怕
  • GPT-OSS-20B vs Qwen3-14B 全面对比测试
  • 8月6日星期三今日早报简报微语报早读
  • 【数字图像处理系列笔记】Ch04:灰度变换与空间域图像增强(2)
  • LeetCode——118. 杨辉三角
  • APP 中 AI 驱动的智能音乐推荐与个性化播放列表生成