Makefile的内置规则

根据内置规则,写了一个简洁的Makefile模板wmakefile,可在github下载:
https://github.com/mnstory/wmakefile

编译一个.c或.cpp文件,一般分为:预处理,生成object文件,链接三个步骤。
你写一个Makefile,不是从零开始,make命令已经给你做了很多内置规则,称为builtin-variables和builtin-rules,make --help可以看到,通过:
-r, --no-builtin-rules Disable the built-in implicit rules.
-R, --no-builtin-variables Disable the built-in variable settings.
可以禁止内置规则。

写一个简洁的Makefile,当然要好好利用内置规则,通过make -p,可以将内置规则列出来,也可以参考文档:
https://www.gnu.org/software/make/manual/html_node/Catalogue-of-Rules.html
内置变量详见:
https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html

预处理过程

c++并没有对c语言的预处理做扩充,所以,能处理c语言的预处理命令完全可以用来处理c++语言,但是,这不代表g++和gcc命令预处理处理的东西完全相同,原因是编译工具也可能内置不同的预定义,比如,g++默认内置定义了__cplusplus和_GNU_SOURCE等,会导致gcc和g++预处理结果不一样,例如:

这样的宏在g++处理后就会存在,gcc处理后就不存在。
继续阅读

_GNU_SOURCE和__USE_GNU的差别

c-cpp.c:

用gcc编译不过,用g++可以:
$ g++ c-cpp.c
$ gcc c-cpp.c
c-cpp.c: In function ‘main’:
c-cpp.c:12:17: error: ‘REG_R8’ undeclared (first use in this function)
c-cpp.c:12:17: note: each undeclared identifier is reported only once for each function it appears in
继续阅读