makefile报错:linker input file unused bacause linking not done

本文详细解析了在makefile配置中常见的错误,包括如何正确指定目标文件和源文件,以及如何使用gcc编译选项。文章提供了具体的解决方案,并对比了错误与正确的配置方式。

1.make后报错

2.通过参考http://blog.sina.com.cn/s/blog_87c063060101ativ.html博客最终找出自己的错误

    1)之前的maleficent文件

        OBJS =  add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o
        CFLAGS = -Iadd -Isub -O2
        TARGET = cacu
        RM = rm -rf

        CC = gcc

        $(TARGET):$(OBJS)
        $(CC) -c -o $(TARGET) $(OBJS) $(CFLAGS)
        $(OBJS):%.o:%.c
        $(CC) -c $(CFLAGS) $< -o $@
clean:
-$(RM) $(TARGET) $(OBJS)

    2)删除“-c”选项问题就可以解决或者把OBJS =  add/add_int.o add/add_float.o sub/sub_int.o sub/sub_float.o main.o改为OBJS =  add/add_int.c add/add_float.c sub/sub_int.c sub/sub_float.c main.c 然后去掉:

$(OBJS):%.o:%.c            $(CC) -c $(CFLAGS) $< -o $@ 以及clean里面的”$(OBJS),以避免删除源文件,同时该方法不生成二进制文件,只生成可执行文件。不适合初学者的我们观测编译的过程。

总结:问题的原因是由于缺少linux编程经验,"-c"选项用来生成“.o”文件,即生成目标文件。而此处通过目标文件生成可执行文件,所以不可以使用“-c"选项。

注:红色标记为错误的地方。

### **GCC警告 "linker input file unused because linking not done" 的原因与解决方法** #### **1. 警告原因** 该警告表示:**你向GCC传递了一个目标文件(如 `.o` 文件),但未触发链接阶段**。常见于以下场景: - 使用了 `-c` 选项(仅编译不链接),却同时提供了 `.o` 文件。 - 混淆了编译和链接步骤,错误地将目标文件当作源文件处理。 --- #### **2. 典型场景与修复方法** ##### **场景1:误用 `-c` 选项** ```bash # 错误命令:试图编译 ipc_pipe.o(已是目标文件) gcc -c ipc_pipe.o ``` **修复**: - 若需链接,移除 `-c`: ```bash gcc ipc_pipe.o -o executable # 直接链接 ``` - 若需重新编译,提供源文件(如 `.c`): ```bash gcc -c ipc_pipe.c # 生成新的 ipc_pipe.o ``` ##### **场景2:混合编译与链接** ```bash # 错误命令:同时编译 .c 和链接 .o gcc -c main.c ipc_pipe.o ``` **修复**:分步操作: ```bash gcc -c main.c # 编译 main.c → main.o gcc main.o ipc_pipe.o -o app # 链接所有目标文件 ``` ##### **场景3:Makefile中的错误规则** ```makefile # 错误示例:对 .o 文件使用 -c %.o: %.c gcc -c $< ipc_pipe.o # 错误混入目标文件 ``` **修复**:确保规则仅处理当前源文件: ```makefile %.o: %.c gcc -c $< # 仅编译当前 .c 文件 ``` --- #### **3. 根本原则** - **编译阶段**(`-c`):仅处理源文件(`.c`/`.cpp`),生成 `.o` 文件。 ```bash gcc -c file.c ``` - **链接阶段**:处理目标文件(`.o`)和库(`.a`/`.so`),生成可执行文件。 ```bash gcc file1.o file2.o -o prog -lm ``` --- #### **4. 高级排查** - 使用 `-###` 查看GCC实际执行的步骤: ```bash gcc -### ipc_pipe.o 2>&1 | grep ld # 检查是否调用链接器 ``` - 若需强制链接(即使只有一个 `.o` 文件): ```bash gcc -Wl,--warn-unresolved-symbols ipc_pipe.o -o test ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值