【鸿蒙pc命令行适配】解决libtool报错:Relocations in generic ELF (EM:183) error adding symbols:file in wrong format

1. 关于libtool

GNU Libtool(简称 libtool)是 GNU 项目推出的一款跨平台编译链接辅助工具,也是开源软件编译体系中(尤其 Autotools 套件)的核心组件。它的核心价值是屏蔽不同操作系统、不同硬件架构、不同编译器的编译 / 链接差异,让开发者用统一的语法编译出适配目标平台的静态库或动态库,无需关注底层工具链的细节差异。libtool 通常与 autoconf、automake 配合使用(合称 Autotools 套件):

  • autoconf:生成configure脚本,检测系统环境、架构;
  • automake:生成 Makefile 模板;
  • libtool:封装编译 / 链接命令,嵌入到 Makefile 中。

编译开源代码时执行的./configure命令,本质就是通过 autoconf 生成适配对应平台的配置,并生成对应的 libtool 脚本,后续make执行的编译 / 链接命令,实际都是通过 libtool 封装的。

2. 报错表现

编译鸿蒙PC版的curl时,configure已经顺利通过,但是执行make命令编译时,最后链接阶段遇到如下报错:

libtool: link: /home/gyl/harmonypc/ohos-sdk/linux/native/llvm/bin/clang -shared -fPIC -DPIC .libs/libcurl_la-altsvc.o .libs/libcurl_la-amigaos.o .libs/libcurl_la-asyn-ares.o .libs/libcurl_la-asyn-thread.o .libs/libcurl_la-base64.o .libs/libcurl_la-bufq.o .libs/libcurl_la-bufref.o .libs/libcurl_la-c-hyper.o .libs/libcurl_la-cf-h1-proxy.o .libs/libcurl_la-cf-h2-proxy.o .libs/libcurl_la-cf-haproxy.o .libs/libcurl_la-cf-https-connect.o .libs/libcurl_la-cf-socket.o .libs/libcurl_la-cfilters.o .libs/libcurl_la-conncache.o .libs/libcurl_la-connect.o .libs/libcurl_la-content_encoding.o .libs/libcurl_la-cookie.o .libs/libcurl_la-curl_addrinfo.o .libs/libcurl_la-curl_des.o .libs/libcurl_la-curl_endian.o .libs/libcurl_la-curl_fnmatch.o .libs/libcurl_la-curl_get_line.o .libs/libcurl_la-curl_gethostname.o .libs/libcurl_la-curl_gssapi.o .libs/libcurl_la-curl_memrchr.o .libs/libcurl_la-curl_multibyte.o .libs/libcurl_la-curl_ntlm_core.o .libs/libcurl_la-curl_path.o .libs/libcurl_la-curl_range.o .libs/libcurl_la-curl_rtmp.o .libs/libcurl_la-curl_sasl.o .libs/libcurl_la-curl_sha512_256.o .libs/libcurl_la-curl_sspi.o .libs/libcurl_la-curl_threads.o .libs/libcurl_la-curl_trc.o .libs/libcurl_la-cw-out.o .libs/libcurl_la-dict.o .libs/libcurl_la-dllmain.o .libs/libcurl_la-doh.o .libs/libcurl_la-dynbuf.o .libs/libcurl_la-dynhds.o .libs/libcurl_la-easy.o .libs/libcurl_la-easygetopt.o .libs/libcurl_la-easyoptions.o .libs/libcurl_la-escape.o .libs/libcurl_la-file.o .libs/libcurl_la-fileinfo.o .libs/libcurl_la-fopen.o .libs/libcurl_la-formdata.o .libs/libcurl_la-ftp.o .libs/libcurl_la-ftplistparser.o .libs/libcurl_la-getenv.o .libs/libcurl_la-getinfo.o .libs/libcurl_la-gopher.o .libs/libcurl_la-hash.o .libs/libcurl_la-headers.o .libs/libcurl_la-hmac.o .libs/libcurl_la-hostasyn.o .libs/libcurl_la-hostip.o .libs/libcurl_la-hostip4.o .libs/libcurl_la-hostip6.o .libs/libcurl_la-hostsyn.o .libs/libcurl_la-hsts.o .libs/libcurl_la-http.o .libs/libcurl_la-http1.o .libs/libcurl_la-http2.o .libs/libcurl_la-http_aws_sigv4.o .libs/libcurl_la-http_chunks.o .libs/libcurl_la-http_digest.o .libs/libcurl_la-http_negotiate.o .libs/libcurl_la-http_ntlm.o .libs/libcurl_la-http_proxy.o .libs/libcurl_la-idn.o .libs/libcurl_la-if2ip.o .libs/libcurl_la-imap.o .libs/libcurl_la-inet_ntop.o .libs/libcurl_la-inet_pton.o .libs/libcurl_la-krb5.o .libs/libcurl_la-ldap.o .libs/libcurl_la-llist.o .libs/libcurl_la-macos.o .libs/libcurl_la-md4.o .libs/libcurl_la-md5.o .libs/libcurl_la-memdebug.o .libs/libcurl_la-mime.o .libs/libcurl_la-mprintf.o .libs/libcurl_la-mqtt.o .libs/libcurl_la-multi.o .libs/libcurl_la-netrc.o .libs/libcurl_la-nonblock.o .libs/libcurl_la-noproxy.o .libs/libcurl_la-openldap.o .libs/libcurl_la-parsedate.o .libs/libcurl_la-pingpong.o .libs/libcurl_la-pop3.o .libs/libcurl_la-progress.o .libs/libcurl_la-psl.o .libs/libcurl_la-rand.o .libs/libcurl_la-rename.o .libs/libcurl_la-request.o .libs/libcurl_la-rtsp.o .libs/libcurl_la-select.o .libs/libcurl_la-sendf.o .libs/libcurl_la-setopt.o .libs/libcurl_la-sha256.o .libs/libcurl_la-share.o .libs/libcurl_la-slist.o .libs/libcurl_la-smb.o .libs/libcurl_la-smtp.o .libs/libcurl_la-socketpair.o .libs/libcurl_la-socks.o .libs/libcurl_la-socks_gssapi.o .libs/libcurl_la-socks_sspi.o .libs/libcurl_la-speedcheck.o .libs/libcurl_la-splay.o .libs/libcurl_la-strcase.o .libs/libcurl_la-strdup.o .libs/libcurl_la-strerror.o .libs/libcurl_la-strtok.o .libs/libcurl_la-strtoofft.o .libs/libcurl_la-system_win32.o .libs/libcurl_la-telnet.o .libs/libcurl_la-tftp.o .libs/libcurl_la-timediff.o .libs/libcurl_la-timeval.o .libs/libcurl_la-transfer.o .libs/libcurl_la-url.o .libs/libcurl_la-urlapi.o .libs/libcurl_la-version.o .libs/libcurl_la-version_win32.o .libs/libcurl_la-warnless.o .libs/libcurl_la-ws.o vauth/.libs/libcurl_la-cleartext.o vauth/.libs/libcurl_la-cram.o vauth/.libs/libcurl_la-digest.o vauth/.libs/libcurl_la-digest_sspi.o vauth/.libs/libcurl_la-gsasl.o vauth/.libs/libcurl_la-krb5_gssapi.o vauth/.libs/libcurl_la-krb5_sspi.o vauth/.libs/libcurl_la-ntlm.o vauth/.libs/libcurl_la-ntlm_sspi.o vauth/.libs/libcurl_la-oauth2.o vauth/.libs/libcurl_la-spnego_gssapi.o vauth/.libs/libcurl_la-spnego_sspi.o vauth/.libs/libcurl_la-vauth.o vtls/.libs/libcurl_la-bearssl.o vtls/.libs/libcurl_la-cipher_suite.o vtls/.libs/libcurl_la-gtls.o vtls/.libs/libcurl_la-hostcheck.o vtls/.libs/libcurl_la-keylog.o vtls/.libs/libcurl_la-mbedtls.o vtls/.libs/libcurl_la-mbedtls_threadlock.o vtls/.libs/libcurl_la-openssl.o vtls/.libs/libcurl_la-rustls.o vtls/.libs/libcurl_la-schannel.o vtls/.libs/libcurl_la-schannel_verify.o vtls/.libs/libcurl_la-sectransp.o vtls/.libs/libcurl_la-vtls.o vtls/.libs/libcurl_la-wolfssl.o vtls/.libs/libcurl_la-x509asn1.o vquic/.libs/libcurl_la-curl_msh3.o vquic/.libs/libcurl_la-curl_ngtcp2.o vquic/.libs/libcurl_la-curl_osslq.o vquic/.libs/libcurl_la-curl_quiche.o vquic/.libs/libcurl_la-vquic.o vquic/.libs/libcurl_la-vquic-tls.o vssh/.libs/libcurl_la-libssh.o vssh/.libs/libcurl_la-libssh2.o vssh/.libs/libcurl_la-wolfssh.o -lssl -lcrypto -lz -L/home/gyl/openssl-3.0.9/openssl-target/lib -O2 -Wl,-soname -Wl,libcurl.so.4 -Wl,-version-script -Wl,.libs/libcurl.ver -o .libs/libcurl.so.4.8.0 /usr/bin/ld: .libs/libcurl_la-altsvc.o: Relocationsingeneric ELF(EM:183)/usr/bin/ld: .libs/libcurl_la-altsvc.o: error adding symbols:fileinwrongformatclang-15: error: linkercommandfailed withexitcode1(use -v to see invocation)

如下图所示:

从日志看,编译器使用的ohos sdk的clang,但是最终链接so时,链接器没有使用ohos sdk的lld,而是用了系统的ld,即使我们定义了LD环境变量也不起作用。这就导致了最终的链接失败。

3. 解决方案

配置ohos sdk时,设置过这几个环境变量:

exportCC="${OHOS_SDK}/native/llvm/bin/clang"exportCXX="${OHOS_SDK}/native/llvm/bin/clang++"exportLD=${OHOS_SDK}/native/llvm/bin/ld.lldexportCFLAGS="--target=aarch64-linux-ohos -fPIC -D__MUSL__=1"exportCXXFLAGS="--target=aarch64-linux-ohos -fPIC -D__MUSL__=1"

虽然,我们在CFLAGS里指定了--target=aarch64-linux-ohos架构,但是libtool并没有去使用它,导致平台架构判断失败,使用了错误的链接器。要解决这个问题,需要在执行configure命令时,给CC环境变量强制追加一个--target=aarch64-linux-ohos,参考命令如下所示,我们将预先定义好的CFLAGS环境变量追加给CC环境变量即可:

./configure --host=aarch64-linux-ohosCC="$CC$CFLAGS"

重新执行./configure之后,重新运行make命令,如下图所示,就可以顺利编译通过了。

4. 总结

本次鸿蒙PC版curl编译失败的核心,是libtool对交叉编译参数的识别机制限制—— 独立的CFLAGS环境变量无法让其感知--target=aarch64-linux-ohos架构信息,导致误调用系统ld链接器而非鸿蒙 SDK 的ld.lld。解决这类问题的关键原则是:针对基于 Autotools 套件的开源软件,交叉编译时必须将架构核心参数直接追加到CC变量中传递给configure,而非依赖独立环境变量。这一原则适用于所有鸿蒙 PC 平台的开源工具交叉编译场景,可从根源上避免工具链不匹配的链接错误。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1125247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ监控

RabbitMQ是一个开源的消息代理和队列服务器,它实现了AMQP协议,用于在分布式系统中传递消息。阿里云AMQP实例就是基于RabbitMQ技术构建的云服务原理:采用生产者-消费者模型工作,消息生产者将消息发送到Exchange(交换机&…

AI应用架构师必备:虚拟工作AI系统的API网关设计与接口安全策略

AI应用架构师必备:虚拟工作AI系统的API网关设计与接口安全策略 副标题:从架构设计到安全防护,构建高可用、可扩展的AI服务入口 第一部分:引言与基础 (Introduction & Foundation) 摘要/引言 随着虚拟工作场景中AI系统的普…

Linux配置Redis服务

步骤 1:确认 Redis 安装路径和配置文件 假设你的 Redis: 二进制文件在:/usr/local/bin/redis-server 和 /usr/local/bin/redis-cli配置文件在:/etc/redis/redis.conf如果你还没把配置文件放好,请先复制一份默认配置 …

2026年论文崩溃救命!智能降重软件秒降知网AIGC率,十佳降AI率产品大揭秘

"# 为什么论文AI率检测成了压垮学生的最后一步? 作为一名毕业季的学生,我深知论文查重AI率高于合格线的恐慌。尤其是如今知网AIGC检测越来越严苛,许多同学通宵修改依然难降重成功。2026年的降AI工具市场像一片火海,哪款智能…

java基础语法总结(数组)零基础入门到精通,收藏这篇就够了

1.数组类型 数组是编程语言中最常见的一种数据结构,可用于储存多个数据,每个数据元素存放一个数据,通常可以通过数组元素的索引来访问数组元素,包括为数组元素赋值和取出数组元素的值。 Java的数组既可以存储基本类型的数据&#…

“拿同一个问题求真理”,为什么违背可控 AI 的工程逻辑

近一年,一个思路在大厂和创业圈迅速流行:把同一个问题,丢给多个 Agent / 多个模型, 让它们讨论、投票、互审, 最后收敛出一个“更可靠的答案”。听起来非常合理,甚至很“科学”。某国际大厂也公开在工程体系…

2026年度本科论文降重实测:知网AI率降到个位数的十佳降AI产品推荐

本科论文降重的痛点与应对策略 本科论文写作接近尾声,查知网AI率的那一刻,总有崩溃感:AI率过高,论文直接被判定为不合格风险大,影响毕业进度甚至未来。作为亲身经历者,我的初稿知网AIGC检测高达62%&#x…

AI 时代,真正被淘汰的不是程序员,而是“不负责判断的技术角色”

一、我们真的进入了“技术过剩”的时代吗?这两年,一个非常普遍的感受正在技术圈蔓延:框架越来越多工具越来越强AI 写代码越来越快但与此同时,程序员的焦虑却并没有减少,反而在加重。于是一个问题被频繁提起&#xff1a…

Java中List排序的3种方法!零基础入门到精通,收藏这篇就够了

在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进行排序操作。比如从第三方接口中获取所有用户的列表,但列表默认是以用户编号从小到大进行排序的,而我们的系统需要按照用户的年龄从大到小进行排序,这个时候,…

计算机毕业设计,基于springboot的网上点餐系统管理系统,附源码+数据库+论文,包远程安装调试运行

1、项目介绍 使用网上点餐系统分为管理员和用户、美食店三个权限子模块。 管理员所能使用的功能主要有:首页、个人中心、用户管理、美食店管理、美食分类管理、美食信息管理、美食订单管理、美食评价管理、系统管理等。 用户可以实现;首页、个人中心、…

为什么多 Agent 编排,不适合高风险量化场景

在上一篇文章中,我们讨论了一个更偏方法论的问题:为什么“把同一个问题交给多个 Agent 求真理”, 在工程上违背了可控 AI 的基本逻辑。而在所有应用场景中, 高风险量化,可能是最不适合多 Agent 编排的那一类。不是因为…

计算机毕业设计,基于springboot的IT技术交流和分享平台,附源码+数据库+论文,包远程安装调试运行

1、项目介绍 用户进入本系统可查看系统信息,包括首页、笔记分享,注册登录后主要功能模块包括个人中心、笔记分享管理、笔记类型管理以及我的收藏管理,用户用例图如图3-1所示。 管理员登录后可对系统进行全面管理,管理员主要实现…

java正则表达式语法大全,零基础入门到精通,收藏这篇就够了

Java 正则表达式是处理字符串匹配、查找、替换的强大工具,以下是常用的正则表达式语法、示例及使用场景总结: 一、基础语法 元字符描述.匹配任意单个字符(除换行符 \n)*匹配前一个字符 0 次或多次匹配前一个字符 1 次或多次?匹…

java base64,零基础入门到精通,收藏这篇就够了

目录 一、Base64诞生背景二、Base64的前缀三、Base64定义四、Base64原理 1.ASCII码转Base64(字节数 % 3 0)2.ASCII码转Base64(字节数 % 3 2)3.ASCII码转Base64(字节数 % 3 1)4.UTF-8转Base64 五、Java实…

学术论文降重难题:为何AI率成“拦路虎”?

作为一名研究生,论文写到一半突遇知网AIGC检测高AI率,真的会崩溃到想通宵。近期,我的论文初稿AI率高达62%,这个数字让人几乎绝望。高校对学术论文的AI率越来越重视,查AI率的标准不断升级,尤其是知网AI率检测…

基于Python+Django体育赛事购票系统设计与实现(球赛售票系统)

前言 🌞博主介绍:✌CSDN特邀作者、全栈领域优质创作者、10年IT从业经验、码云/掘金/知乎/B站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战,以及程序定制化开发、文档编写、答疑辅导等。✌…

java----内部类(四种内部类详解)收藏这篇就够了

文章目录 1. 内部类的定义与使用 1.1 基本概念1.2 内部类为什么存在1.3 内部类与外部类的关系 2. 内部类 2.1、内部类的分类2.2、成员内部类2.3、静态内部类2.4、方法内部类2.5、匿名内部类 1. 内部类的定义与使用 外部类只能用public和default默认修饰符,但内部…

论文AI率高到崩溃?试试这两款论文降重神器

作为一名大学生,写论文时最怕的就是知网查重和AIGC检测显示AI率过高,尤其是遇到论文AI率高达60%以上,真的会崩溃通宵改改改,焦虑到没招。近期我用了两款被业界认定的论文降重神器——【嘎嘎降AI】和【比话降AI】,切实体…

2026年度救命神器!论文知网AIGC检测崩溃怎么办?揭秘三款顶级AI痕迹消除降重神器,告别通宵降AI率焦虑

"# 为什么论文AI率成了挂科的隐形“炸弹”? 每到论文查重季,无数学生通宵加班,结果却因AI痕迹率高被知网AIGC检测“秒杀”,惨遭降分甚至挂科。AI生成内容越来越普遍,导致论文中的AI率急剧升高,不少同…

Java生成UUID的常用方式,零基础入门到精通,收藏这篇就够了

java.util.UUID类来生成UUID import java.util.UUID;public class UUIDGenerator {public static void main(String[] args) {//随机生成一个UUID对象UUID uuid UUID.randomUUID();System.out.println("生成的UUID为:" uuid.toString());//通过给定的…