我正在学习 C++,虽然我现在有一个普遍的问题,即不是针对程序员,但恕我直言最适合 Linux 用户。
我想要:
make
Run Code Online (Sandbox Code Playgroud)
命令总是构建一个新的二进制文件,这可以通过创建一个 Bash 别名来轻松完成,例如:
alias make='\make clean && \make'
Run Code Online (Sandbox Code Playgroud)
我不想定义alias
,这可以在Makefile
一方实现吗?
Makefile
我能想到的最简单的方法如下:
PROGRAM=project
CXXFLAGS=-std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
OPTIMIZATION=-O2
.PHONY: build
.PHONY: clean
.PHONY: distrib
build: ${PROGRAM}
clean:
rm ${PROGRAM}
distrib:
tar -czf ${PROGRAM}.tar.gz ${PROGRAM}.cpp Makefile
${PROGRAM}:
g++ ${PROGRAM}.cpp ${CXXFLAGS} ${OPTIMIZATION} -o ${PROGRAM}
Run Code Online (Sandbox Code Playgroud)
现在,在这种状态下,它说:
Run Code Online (Sandbox Code Playgroud)make: Nothing to be done for 'build'.
从本质上讲,我认为它可能会看到最近的时间戳并且不会构建。
编辑1:
我只会补充一点,这个问题不Tab相关,当二进制文件没有到位时它会正常构建。
编辑2:
根据佐藤桂的回答进行修改后:
该Makefile
如下所示:
https://www.vlastimilburian.cz/public/linux/Makefile.gz
(我上传了,因为Tabs不能用文字显示)
它仍然说如上述信息:
Run Code Online (Sandbox Code Playgroud)make: Nothing to be done for 'build'.
编辑3:
$ make --version
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Run Code Online (Sandbox Code Playgroud)
这是一个快速检查清单:
rm
,tar
,g++
等)$(FOO)
扩展变量FOO
而不是${FOO}
或$FOO
你Makefile
应该看起来像这样(同样,行用制表符缩进,而不是空格):
PROGRAM=project
CXXFLAGS=-std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
OPTIMIZATION=-O2
.PHONY: build
.PHONY: clean
.PHONY: distrib
build: $(PROGRAM)
clean:
rm $(PROGRAM)
distrib:
tar -czf $(PROGRAM).tar.gz $(PROGRAM).cpp Makefile
$(PROGRAM): $(PROGRAM).cpp
g++ $(PROGRAM).cpp $(CXXFLAGS) $(OPTIMIZATION) -o $(PROGRAM)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23278 次 |
最近记录: |