news 2026/6/10 12:46:27

【鸿蒙 PC 命令行适配】c-ares 在鸿蒙 PC 上的移植与交叉编译实战(可复现指南)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【鸿蒙 PC 命令行适配】c-ares 在鸿蒙 PC 上的移植与交叉编译实战(可复现指南)

文章目录

  • 【鸿蒙 PC 命令行适配】c-ares 在鸿蒙 PC 上的移植与交叉编译实战(可复现指南)
    • 前言
    • 一、OHOS SDK
    • 二、前置环境
    • 三、下载 c-ares 源码
    • 四、配置交叉编译环境(核心步骤)
      • 4.1 CMake 交叉编译参数
    • 五、编译与安装
    • 六、部署到鸿蒙 PC
    • 七、真机验证(关键)
      • 7.1 测试程序(DNS 查询)
      • 7.2 编译链接(鸿蒙 PC)
    • 八、适配过程中的经验总结
    • 九、总结

【鸿蒙 PC 命令行适配】c-ares 在鸿蒙 PC 上的移植与交叉编译实战(可复现指南)

前言

在网络型应用中,DNS 解析是一个绕不开的基础能力。虽然系统通常提供同步的getaddrinfo()接口,但在高并发、事件驱动或网络库内部,阻塞式 DNS往往成为性能瓶颈。

c-ares是一个由 Google 维护的、成熟稳定的异步 DNS 解析库,被广泛用于 curl、Node.js、libuv 等核心项目。它采用纯 C 实现、系统依赖极少,非常适合作为鸿蒙 PC 层的基础网络库

本文将基于OHOS SDK + Clang/LLVM,完整演示c-ares 在鸿蒙 PC(AArch64)上的交叉编译、部署与真机验证流程,所有步骤均可直接复现。


一、OHOS SDK

OHOS SDK之前的文章也有写过,大体步骤如下
官方下载地址:

https://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist

下载完成后,通常得到一个类似如下名称的压缩包:

ohos-sdk-full_linux_xxx.tar.gz

解压 OHOS SDK

将下载好的 SDK 压缩包解压到一个固定目录(建议统一放在 /opt 或 $HOME 下,便于长期维护):

tar-xzf ohos-sdk-full_linux_xxx.tar.gz

解压完成后,会得到顶层目录:

ohos-sdk/

进入 ohos-sdk/linux 目录,可以看到多个子组件,其中交叉编译只需要关注以下目录:

接下来分别解压这两个子包(如果它们仍是压缩文件):

cdohos-sdk/linuxtar-xzf native*.tar.gztar-xzf toolchains*.tar.gz

其中:
llvm包含 Clang、LLVM、lld、llvm-ar 等交叉编译工具

二、前置环境

已经完成以下准备:

  • 已安装OHOS SDK
  • 已配置 Clang/LLVM 工具链
  • 开发机为 Linux x86_64

关键环境变量如下:

exportOHOS_SDK=/opt/ohos-sdk/linux/nativeexportPATH=$OHOS_SDK/llvm/bin:$PATHexportSYSROOT=$OHOS_SDK/sysroot

验证:

clang --version

确认输出来自 OHOS SDK。


三、下载 c-ares 源码

c-ares 官方仓库:

https://github.com/c-ares/c-ares

这里使用稳定版本1.19.x

wgethttps://github.com/c-ares/c-ares/releases/download/cares-1_19_1/c-ares-1.19.1.tar.gztar-xzf c-ares-1.19.1.tar.gzcdc-ares-1.19.1

目录结构:

四、配置交叉编译环境(核心步骤)

c-ares 使用 CMake,推荐独立构建目录

mkdirbuild-ohoscdbuild-ohos

4.1 CMake 交叉编译参数

cmake..\-DCMAKE_SYSTEM_NAME=Linux\-DCMAKE_C_COMPILER=clang\-DCMAKE_C_FLAGS="--target=aarch64-linux-ohos --sysroot=$SYSROOT"\-DCARES_STATIC=ON\-DCARES_SHARED=OFF\-DCARES_BUILD_TESTS=OFF\-DCMAKE_INSTALL_PREFIX=$(pwd)/install

参数说明:

参数说明
CMAKE_SYSTEM_NAME=Linux鸿蒙 PC 在 ABI 层与 Linux 兼容
CARES_STATIC=ON优先验证静态库
CARES_SHARED=OFF避免动态库部署干扰
CARES_BUILD_TESTS=OFF交叉编译不跑测试

五、编译与安装

make-j$(nproc)makeinstall



安装完成后得到:

install/ ├── include/ares.h ├── include/ares_version.h └── lib/libcares.a

这说明:

  • c-ares 已成功生成AArch64 鸿蒙 ELF 静态库
  • 头文件与符号导出正常

六、部署到鸿蒙 PC

将目录拷贝到鸿蒙 PC:

七、真机验证(关键)

7.1 测试程序(DNS 查询)

在鸿蒙 PC 上创建测试文件test_ares.c

#include<stdio.h>#include<ares.h>voidcallback(void*arg,intstatus,inttimeouts,structares_addrinfo*res){if(status==ARES_SUCCESS&&res){printf("DNS resolve success\n");ares_freeaddrinfo(res);}else{printf("DNS resolve failed\n");}}intmain(){ares_library_init(ARES_LIB_INIT_ALL);ares_channel channel;if(ares_init(&channel)!=ARES_SUCCESS){printf("ares_init failed\n");return1;}structares_addrinfo_hintshints={0};hints.ai_family=AF_INET;ares_getaddrinfo(channel,"www.example.com",NULL,&hints,callback,NULL);for(;;){fd_set r,w;intnfds;structtimevaltv;FD_ZERO(&r);FD_ZERO(&w);nfds=ares_fds(channel,&r,&w);if(nfds==0)break;ares_timeout(channel,NULL,&tv);select(nfds,&r,&w,NULL,&tv);ares_process(channel,&r,&w);}ares_destroy(channel);ares_library_cleanup();return0;}

说明:
这里使用select + ares_process,这是 c-ares 最标准、最可移植的用法。


7.2 编译链接(鸿蒙 PC)

clang test_ares.c -I$(pwd)/include$(pwd)/lib/libcares.a -o test_ares

运行:

./test_ares

输出示例:

DNS resolve success


此时证明:

c-ares 静态库正常工作
libcares.a 已经可以在鸿蒙 PC 上被正确链接和调用。
DNS 查询功能正常
ares_getaddrinfo 能够正确向系统 DNS 解析服务器发送请求,并成功返回 IP 地址信息。
输出 DNS resolve success 表示解析 “www.baidu.com” 成功。
交叉编译环境配置正确
用 AArch64 交叉编译生成的静态库,在鸿蒙 PC 的 Linux ABI 层能正确运行,没有出现符号缺失或运行错误。
基础网络调用可用

说明鸿蒙 PC 上的网络栈、select/select-based 事件处理等都可用,c-ares 可以正常工作。

可以写一个更加完善的代码。

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ares.h>#include <arpa/inet.h>#include <netdb.h>#include <sys/select.h>struct query{const char *hostname;intdone;};void query_callback(void *arg, int status, int timeouts, struct ares_addrinfo *res){struct query *q=(struct query *)arg;q->done=1;// 标记查询完成if(status==ARES_SUCCESS&&res){printf("[%s] DNS resolve success:\n", q->hostname);for(struct ares_addrinfo_node *node=res->nodes;node;node=node->ai_next){char ip[INET6_ADDRSTRLEN];if(node->ai_family==AF_INET){struct sockaddr_in *sa=(struct sockaddr_in *)node->ai_addr;inet_ntop(AF_INET,&sa->sin_addr, ip, sizeof(ip));printf(" IPv4: %s\n",ip);}elseif(node->ai_family==AF_INET6){struct sockaddr_in6 *sa6=(struct sockaddr_in6 *)node->ai_addr;inet_ntop(AF_INET6,&sa6->sin6_addr, ip, sizeof(ip));printf(" IPv6: %s\n",ip);}}ares_freeaddrinfo(res);}else{printf("[%s] DNS resolve failed (status=%d)\n", q->hostname, status);}}intmain(){ares_library_init(ARES_LIB_INIT_ALL);ares_channel channel;if(ares_init(&channel)!=ARES_SUCCESS){fprintf(stderr,"ares_init failed\n");return1;}const char *hosts[]={"www.baidu.com","www.bing.com","www.csdn.net"};const int n_hosts=sizeof(hosts)/sizeof(hosts[0]);struct query queries[n_hosts];memset(queries,0, sizeof(queries));// 初始化查询for(int i=0;i<n_hosts;++i){queries[i].hostname=hosts[i];queries[i].done=0;struct ares_addrinfo_hints hints;memset(&hints,0, sizeof(hints));hints.ai_family=AF_UNSPEC;// IPv4 + IPv6 ares_getaddrinfo(channel, hosts[i], NULL,&hints, query_callback,&queries[i]);}// 事件循环 int unfinished;do{fd_set read_fds, write_fds;FD_ZERO(&read_fds);FD_ZERO(&write_fds);int nfds=ares_fds(channel,&read_fds,&write_fds);if(nfds==0)break;struct timeval tv;struct timeval *tvp=ares_timeout(channel, NULL,&tv);select(nfds,&read_fds,&write_fds, NULL, tvp);ares_process(channel,&read_fds,&write_fds);// 检查是否所有查询完成 unfinished=0;for(int i=0;i<n_hosts;++i){if(!queries[i].done){unfinished=1;break;}}}while(unfinished);ares_destroy(channel);ares_library_cleanup();return0;}

命令:

clang test_ares_multi.c\-I$(pwd)/include\$(pwd)/lib/libcares.a\-o test_ares_multi

运行

./test_ares_multi


支持 IPv4 + IPv6
可同时查询多个域名
使用标准 C 回调,无需 Lambda 或 C++

结论:

c-ares AArch64 静态库在鸿蒙 PC 已经 可用
可以继续开发使用 c-ares 的应用,例如异步 DNS 查询、HTTP 客户端、网络工具等

八、适配过程中的经验总结

在鸿蒙 PC 上移植 c-ares 的过程中,最大的感受是系统的开发环境非常友好。OHOS SDK 提供了完整的 AArch64 交叉编译工具链和清晰的 sysroot 配置,使得从源码到静态库的构建几乎零障碍。即便是网络库这样涉及底层系统调用和事件处理的组件,也能顺利编译、链接并在真机上运行。鸿蒙 PC 的 Linux ABI 兼容性出色,使得 select、poll 等标准接口无需额外适配即可使用,同时静态库部署简单,调试效率高,整体开发体验非常顺畅。

九、总结

通过本次 c-ares 的移植与验证实践,可以看出鸿蒙 PC 的平台生态已经非常成熟且高效。无论是交叉编译工具链、系统兼容性,还是运行时的网络栈和事件机制,都表现出企业级开发所需的稳定性和可靠性。开发者可以放心地在鸿蒙 PC 上构建高性能网络应用,享受到极佳的开发体验,同时充分利用 AArch64 架构优势,实现跨平台、高效、安全的网络服务。鸿蒙 PC 不仅降低了移植门槛,也为网络库和系统组件的创新提供了坚实的基础。

欢迎加入开源鸿蒙PC社区:https://harmonypc.csdn.net/

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:54:31

CosyVoice-300M Lite成本优化:低资源环境部署实战案例

CosyVoice-300M Lite成本优化&#xff1a;低资源环境部署实战案例 1. 为什么在50GB磁盘纯CPU环境下&#xff0c;还能跑出专业级语音合成&#xff1f; 你有没有遇到过这样的情况&#xff1a;想在一台刚租的入门级云服务器上试试语音合成&#xff0c;结果光装依赖就卡死——ten…

作者头像 李华
网站建设 2026/6/10 11:49:55

亲测Emotion2Vec+ Large镜像,上传音频即可识别快乐、愤怒等9种情绪

亲测Emotion2Vec Large镜像&#xff0c;上传音频即可识别快乐、愤怒等9种情绪 1. 开箱即用&#xff1a;3分钟完成语音情感识别全流程 你是否曾想过&#xff0c;一段几秒钟的语音里&#xff0c;藏着多少未被言说的情绪密码&#xff1f;当客服电话中客户语气突然变冷&#xff0…

作者头像 李华
网站建设 2026/6/7 16:50:04

HY-Motion 1.0详细步骤:低显存优化技巧(--num_seeds=1)实测

HY-Motion 1.0详细步骤&#xff1a;低显存优化技巧&#xff08;--num_seeds1&#xff09;实测 1. 为什么你需要这篇实测指南&#xff1f; 你是不是也遇到过这样的情况&#xff1a;下载了HY-Motion 1.0模型&#xff0c;满怀期待地准备生成一段丝滑的3D动作&#xff0c;结果刚敲…

作者头像 李华
网站建设 2026/5/16 22:28:49

批量生成数字人视频?用HeyGem效率提升10倍

批量生成数字人视频&#xff1f;用HeyGem效率提升10倍 你是否经历过这样的场景&#xff1a;为一场线上培训准备5个不同讲师风格的数字人讲解视频&#xff0c;每个3分钟&#xff0c;手动上传、等待、下载、再上传……光是操作就耗掉近2小时&#xff1f;更别说中间某次失败还得重…

作者头像 李华
网站建设 2026/5/31 2:09:23

FaceRecon-3D多场景落地:虚拟偶像建模、医疗面部分析、安防特征提取

FaceRecon-3D多场景落地&#xff1a;虚拟偶像建模、医疗面部分析、安防特征提取 1. 这不是“修图”&#xff0c;是把一张照片“立起来” 你有没有试过&#xff0c;只用手机拍一张自拍&#xff0c;就生成一个能360度旋转、带真实皮肤纹理的3D人脸模型&#xff1f;不是靠一堆照…

作者头像 李华
网站建设 2026/5/30 23:19:03

Qwen2.5与LangChain集成:RAG系统部署实战

Qwen2.5与LangChain集成&#xff1a;RAG系统部署实战 1. 为什么选Qwen2.5-7B-Instruct做RAG底座 很多开发者在搭建RAG系统时&#xff0c;第一反应是用Llama 3或Mixtral&#xff0c;但实际跑下来会发现&#xff1a;小模型响应快但知识陈旧&#xff0c;大模型知识新但显存吃紧、…

作者头像 李华