You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编、C主程序与Makefile链接问题:undefined reference错误

ARM64 Ubuntu下链接C/汇编库时undefined reference错误的解决方法

问题场景

我在学习汇编语言的个人项目中,尝试把C实现的简单函数转为汇编实现,同时构建一个C库和一个汇编库。项目结构如下:

  • Makefile
  • c-asm-lib.h
  • main.c
  • asm-src/asm_isalpha.s
  • c-src/_isalpha.c

运行环境是Macbook M3上UTM虚拟机里的ARM64架构Ubuntu 24.04.1。编写好对应代码后,执行make test时出现链接错误:

/usr/bin/ld: main.c:(.text+0x24): undefined reference to asm_isalpha

触发错误的编译命令是:

${CC} ${CFLAGS} ${CLIB} ${ASMLIB} -I./ main.c

把main.c移到${CLIB}和${ASMLIB}前面后,问题就解决了。

原因分析

链接器处理输入文件的顺序是从左到右的:

  1. 当先处理${CLIB}和${ASMLIB}时,链接器还没看到main.c里对asm_isalpha的引用,会判定这些库中的符号没有被使用,不会把它们加入最终的可执行文件。
  2. 等后续处理main.c时,发现需要asm_isalpha这个符号,但此时已经没有库文件可以去查找该符号的定义了,于是抛出未定义引用的错误。

解决方案

调整编译命令的顺序,把包含符号引用的源文件(main.c)放在库文件的前面,让链接器先看到符号的引用,再去后面的库中匹配对应的定义。修正后的命令如下:

${CC} ${CFLAGS} -I./ main.c ${CLIB} ${ASMLIB}

补充说明

  • 对于静态库(.a格式),这种“按需提取符号”的逻辑是标准行为,链接器只会从库中取出当前已经被引用到的符号;
  • 即便使用动态库,保持“源文件在前、库在后”的顺序也是通用的最佳实践,能规避绝大多数链接符号相关的问题。

内容的提问来源于stack exchange,提问作者Pyg Argus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 01:14:57