Make命令未生成可执行文件main的问题求助
Make未生成可执行文件main的问题排查与解决
问题场景
使用以下Makefile执行make命令时,未生成预期的可执行文件main,编译行为与预期不符;再次执行make时,提示'main' is up to date。
你的Makefile内容
CC=gcc CFLAGS=-Wall main: hello.o hello_fn.o clean: rm -f main hello.o hello_fn.o
预期输出
$ make gcc -Wall -c -o hello.o main.c gcc -Wall -c -o hello_fn.o hello_fn.c gcc hello.o hello_fn.o -o main
实际输出
$ make gcc -Wall -c -o hello.o hello.c gcc -Wall -c -o hello_fn.o hello_fn.c
解决方案
1. 修正源文件与目标文件的匹配关系
Make的隐式规则默认认为hello.o对应的源文件是hello.c,但你预期用main.c生成hello.o,这和隐式规则逻辑冲突。你有两种选择:
- 把源文件改名为
hello.c,贴合隐式规则; - 或者显式指定
hello.o的依赖源文件,在Makefile中添加:hello.o: main.c $(CC) $(CFLAGS) -c -o $@ $<
2. 显式指定链接步骤
虽然Make理论上会自动为可执行文件执行链接,但当隐式规则生成的.o文件不符合预期时,容易导致Make误判状态。显式写出链接规则可以彻底避免这个问题:
main: hello.o hello_fn.o $(CC) $^ -o $@
修正后的完整Makefile
CC=gcc CFLAGS=-Wall hello.o: main.c $(CC) $(CFLAGS) -c -o $@ $< main: hello.o hello_fn.o $(CC) $^ -o $@ clean: rm -f main hello.o hello_fn.o
执行修正后的Makefile,就能得到你预期的编译输出,并生成可执行文件main。
内容的提问来源于stack exchange,提问作者Rodion Iskhakov
相关产品推荐
相关产品推荐

