为何每次执行make时都会自动运行make install命令?
问题分析与解决
你的Makefile内容
ifeq ($(PREFIX),) PREFIX := /usr endif install: libriscy.so.1.0 install -d $(DESTDIR)$(PREFIX)/lib/ install -m 755 libriscy.so.1.0 $(DESTDIR)$(PREFIX)/lib/ ln -s $(DESTDIR)$(PREFIX)/lib/libriscy.so.1.0 $(DESTDIR)$(PREFIX)/lib/libriscy.so libriscy.so.1.0: riscy.o riscyA.o riscyinit.o ld -fpic --shared -o libriscy.so.1.0 riscy.o riscyA.o riscyinit.o -lc -ldl riscy.o: riscy.c riscyvar.S gcc -c -fPIC riscy.c -o riscy.o riscyA.o: riscy.S riscyvar.S as -c -fpic riscy.S -o riscyA.o riscyinit.o: riscyinit.c gcc -c -g -fpic riscyinit.c -o riscyinit.o
当前目录状态
adrian@starfive:~/riscyforth/riscylib$ ls -l total 112 -rwxr-xr-x 1 adrian adrian 25680 Aug 25 18:16 libriscy.so.1.0 -rw-r--r-- 1 adrian adrian 558 Aug 25 18:05 makefile -rw-r--r-- 1 adrian adrian 22426 Aug 24 17:41 riscy.S -rw-r--r-- 1 adrian adrian 3549 Aug 24 17:41 riscy.c -rw-r--r-- 1 adrian adrian 9560 Aug 24 17:54 riscy.o -rw-r--r-- 1 adrian adrian 13440 Aug 24 17:54 riscyA.o -rw-r--r-- 1 adrian adrian 1601 Aug 24 17:41 riscyinit.c -rw-r--r-- 1 adrian adrian 15520 Aug 24 17:54 riscyinit.o -rw-r--r-- 1 adrian adrian 1561 Aug 24 17:41 riscyvar.S
原因
Make的默认行为是执行Makefile里第一个出现的目标。你的Makefile里第一个目标是install,而install既不是声明的伪目标,当前目录下也没有名为install的文件或目录——Make会认为这个目标需要被生成,哪怕它的依赖libriscy.so.1.0已经存在,只要目标本身不存在,就会执行对应的命令。
解决方法
有两种常见的修复方式:
1. 把install声明为伪目标
在Makefile合适位置添加:
.PHONY: install
这样Make就不会去检查是否存在install文件,只有当你显式执行make install时才会运行这个目标的命令,默认执行make时会跳过它,转而执行后续的第一个实际文件目标(也就是libriscy.so.1.0)。
2. 添加默认目标all
在Makefile最开头添加一个all目标,让它成为第一个目标,依赖你默认想构建的文件:
all: libriscy.so.1.0 ifeq ($(PREFIX),) PREFIX := /usr endif # 后面的内容不变...
这样默认执行make时,只会构建libriscy.so.1.0(如果它或它的依赖有更新的话),而install目标只有你显式运行make install时才会执行。
内容的提问来源于stack exchange,提问作者adrianmcmenamin
相关产品推荐
相关产品推荐

