选项说明:
-Wall 选项 :可以打印出编译时所有的错误或者警告信息。变量没有初始化,类型不匹配,没有使用的变量或者类型转换错误等警告提示。
-fPIC 选项:适用于动态连接,作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意 位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
-fpermissive选项:用这个选项,可以兼容一些老的语法,但是一些语法错误也会被忽略。该选项需慎重使用,因为会降低对于代码检查的严格性。
-DDEBUG :相当于定义了宏DEBUG,代码中可以用#ifdef DEBUG来控制调试输出信息等。可以用-D加名字定义一些用到的宏定义。
-I 选项:(i的大写)编译选项(准确的是说是预处理选项CFLAGS或者CPPFLAGS中指定),用来指定预处理时查找头文件的范围的。
-L选项 :链接选项(LDFLAGS中指定),用来告诉链接器到哪个路径下面去找动态链接库。
-l 选项: (L的小写)链接选项(LDFLAGS中指定),用来指定链接额外的库(譬如我们用到了uuid,就用-luuid,链接器就会去链接libuuid.so)
-shared :创建动态链接库使用的选项。
自定变量:
$@:表示规则中的目标文件集。在模式规则中,如果有多个目标,那么, $@ 就是匹配于目标中模式定义的集合。
$% :仅当目标是函数库文件时,表示规则中的目标成员名。例如,如果一个目标是 foo.a(bar.o),那么, $% 就是 bar.o , $@ 就是 foo.a 。如果目标不是函数库文件(Unix 下是 .a , Windows下是 .lib ),那么,其值为空
$< :依赖目标中的第一个目标名字。如果依赖目标是以模式(即 % )定义的,那么 $< 将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
$? :所有比目标新的依赖目标的集合。以空格分隔。
$^ :所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
$+ :所有依赖目标的集合,不去除重复的依赖目标。
# flags
CC = gcc
CXX = g++
CXXFLAGS = -Wall -fPIC -std=c++11 -fpermissive
LDFLAGS = -shared
# args
RELEASE = 0 #控制release还是debug版本 0代表debug版本 ,1代表release版本
BITS = 64 #64还是32位
# [args] 程序位数. 32