makefile
include
"include"指示符告诉 make 暂停读取当前的 Makefile,而转去读取"include"指定的一个或者多个文件,完成以后再继续当前 Makefile 的读取。
如果在当前目录下或者指定的绝对路径找不到目标文件,make将根据文件名进行查找:
-
查找使用命令行选项 “-I” 指定的目录;
-
“/usr/gnu/include”,"/usr/local/include","/usr/include",如果这些目录存在的话;
当在这些目录下都没有找到“include”指定的文件时,make将会提示一个包含文件未找到的告警提示,但是不会立刻退出。而是继续处理Makefile的后续内容。当完成读取整个Makefile后,make将试图使用规则来创建通过指示符“include”指定的但未找到的文件,当不能创建它时(没有创建这个文件的规则),make将提示致命错误并退出。
有时候,当被include的文件不重要时,也就是说是否include了,没太大关系,那么可以在include前加"-",表示忽略该错误。
-include FILENAMES…
使用这种方式时,当所要包含的文件不存在时不会有错误提示、make也不会退出。
CC 与 CXX
这是 C 与 C++ 编译器命令。默认值一般是 “gcc” 与 “g++”。
CPPFLAGS
这是用于预处理阶段的选项。
CFLAGS 与 CXXFLAGS
CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项。这两个变量实际上涵盖了编译和汇编两个步骤。
使用 c++11:
CXXFLAGS += -std=c++11
= := ?= +=
- ?=
如果没有被赋值过就赋予等号后面的值。 - +=
添加等号后面的值 。 - =
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。 - :=
表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
-Wl:rpath=path
这条编译指令会在编译时记录到target文件中,所以编译之后的target文件在执行时会按这里给出的路径去找库文件。
如:-Wl:rpath=/home/hello/lib
表示将/home/hello/lib目录作为程序运行时第一个寻找库文件的目录,
程序寻找顺序是:/home/hello/lib ,/usr/lib,/usr/local/lib
可以加多个包含路径,程序在运行时的寻找顺序为添加的顺序。
wildcard
这个命令是文件名处理函数:$(wildcard pattern),获取跟当前模式匹配的文件名。
gcc
shared:生成共享库格式
fPIC: 产生位置无关码,允许在任何地址加载 (否则只能从指定地址加载,无法控制)相对地址
-l :就是用来指定程序要链接的库;
-L :放在 /lib 和 /usr/lib 和 /usr/local/lib 里的库直接用 -l 参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,编译时就要用 -L参数指定库路径;
-I :参数是用来指定头文件目录,/usr/include 目录一般是不用指定的,gcc 知道去那里找,但是如果头文件不在 /usr/include 里我们就要用 -I 参数指定了。