C语言编译出现ld链接错误的原因及含义咨询
编译C程序时链接阶段报错的原因解析
问题描述
编写了如下C程序,文件路径为/Users/farhanaazmohammed/Code/vars/c:
#include <stdio.h> int main(){ int num = 100; double pi = 3.1415926536; printf("Integer is %d ",num); printf("Values are %d and %f ",num,pi); printf("%%7d displays %7d ",num); printf("%%07d displays %07d ",num); printf("Pi is approximately %1.10f ",pi); printf("Right-aligned %20.3f rounded pi ",pi); printf("Left-aligned %-20.3f rounded pi ",pi); return 0; }
尝试编译到vars/exe时,得到错误信息:
ld: warning: ignoring file c, building for macOS-x86_64 but attempting to link with file built for unknown-unsupported file format ( 0x23 0x69 0x6E 0x63 0x6C 0x75 0x64 0x65 0x20 0x3C 0x73 0x74 0x64 0x69 0x6F 0x2E ) Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
疑问:为何编译仅在汇编阶段报错,该错误具体是什么意思?
错误解析与解决方法
阶段纠正:不是汇编阶段,是链接阶段
报错中的ld是系统链接器,说明错误发生在链接阶段而非汇编阶段。汇编阶段负责将编译后的中间代码转为机器码,链接阶段则是将目标文件、系统库等整合为可执行文件。错误原因拆解
- 链接器无法识别输入文件格式:警告信息里的十六进制字节
0x23 0x69 0x6E 0x63...对应C源码的开头#include <stdio.h>,说明你直接把纯文本的C源码文件传给了链接器。链接器只处理编译后的目标文件(.o)或库文件,不识别C源码格式,因此会忽略该文件。 - 找不到
_main符号:C程序的入口是main函数,由于链接器没有拿到包含main函数的目标代码(C源码未被正确编译),无法找到程序的启动入口,因此抛出“symbol(s) not found”错误。
- 链接器无法识别输入文件格式:警告信息里的十六进制字节
正确的编译命令
你需要让编译器先编译C源码,再完成链接。可以用一步到位的命令:clang /Users/farhanaazmohammed/Code/vars/c -o /Users/farhanaazmohammed/Code/vars/exe或者分两步执行:
# 编译生成目标文件 clang -c /Users/farhanaazmohammed/Code/vars/c -o /Users/farhanaazmohammed/Code/vars/c.o # 链接生成可执行文件 clang /Users/farhanaazmohammed/Code/vars/c.o -o /Users/farhanaazmohammed/Code/vars/exe代码额外提示
你的代码中printf里的换行使用了直接换行,正确写法应为\n,比如printf("Integer is %d\n", num);,否则程序运行时可能出现输出异常。
内容的提问来源于stack exchange,提问作者Zayd Mohammed
相关产品推荐
相关产品推荐

