----参考网络整理
1、gcc常用的几个参数
-o 指定可执行程序的名称 //gcc -o main main.o----->main.o链接为main这一可执行程序
-c 只要求编译器输出目标代码,而不用生成可执行程序(即:只编译,不链接,只生成 .o文件)//gcc -c main.c------>生成 main.o
-g 要求编译器在编译的时候提供我们以后对程序进行调试的信息
-Wall 允许发出gcc所有有用的报警信息
2、gcc包含的库路径及库文件
对于一些标准库来说,我们没有必要指出路径。只要它们在起缺省库的路径下就可以了。系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径。
其余的库,需要我们指定路径和库名
-l库名 //小写的L // gcc -o temp temp.c -lm //使用了数学函数,添加m库。
-L库路径 //大写的L // -L/home/hoyt/mylib
gcc -o temp temp.c -L/home/hoyt/mylib -lmytest
注意:库路径和库名是分开的,都要添加。
3、gcc中包含头文件
INCLUDES =-I./include
INCLUDES +=-I./myinclude
3、makefile常用的变量及通配符
$@ 目标文件
$^ 所有依赖文件
$< 表示第一个依赖文件 //第一个依赖文件是.c文件。
$? 表示比目标还要新的依赖文件列表
- 通配符符号:%
举例:
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $<
4、链接
$(TARGET):$(OBJ)
@mkdir -p output
$(CC) $(OBJ) $(INCLUDES) $(LIB_PATH) $(LIB_NAMES) -g -o output/$(TARGET)$(VERSION) -std=c++11
//我们发现:最终生成的可执行文件为target加了版本号的,也就是说虽然 TARGET,最终是以-o为最终结果。
5、makefile中所有的.c编译成.o文件 %.o:%.c
%.o 是指以.o结尾,当然这里也可以使用通配符*,只不过%多用于Makefile。
//作用:将后缀为.c的文件都编译成同名的.o文件
CC =/usr/local/arm/arm-zynq-v6.2.1/bin/arm-linux-gnueabihf-g++
DEBUG =-DUSE_DEBUG
CFLAGS =-Wall
%.o:%.c
$(CC) $(INCLUDES) $(DEBUG) -c $(CFLAGS) -std=c++11 $< -o $@
6、makefile常用函数
1)获取匹配模式文件名函数— wildcard
“PATTERN”使用 shell可识别的通配符,包括“ ?”(单字符)、“*”(多字符)等
语法:$(wildcard PATTERN)
函数功能:列出当前目录下所有符合模式“ PATTERN”格式的文件名。
返回值:空格分割的、存在当前目录下的所有符合模式“ PATTERN”的文件名。
CFILES = $(wildcard *.c) //变量CFILES 赋值为所有以.c结尾的文件。//返回的文件以空格分隔开显示的。
2)模式替换函数— patsubst
参数 “TEXT ”单词之间的多个空格在处理时被合并为一个空格,并忽略前导和结尾空格。
语法:$(patsubst PATTERN,REPLACEMENT,TEXT)
函数功能:搜索“ TEXT”中以空格分开的单词,将否符合模式“ TATTERN ”替换为“REPLACEMENT ”。参数“PATTERN”中可以使用模式通配符 “%”来代表一个单词中的若干字符。 如果参数“REPLACEMENT ”中也包含一个“%”,那么“ REPLACEMENT ”中的“ %”将是“ TATTERN”中的那个“ %”所代表的字符串。在“ TATTERN ”和“REPLACEMENT ”中,只有第一个“ %”被作为模式字符来处理,之后出现的不再作模式字符(作为一个字符)。在参数中如果需要将第一个出现的“ %”作为字符本身而不作为模式字符时,可使用反斜杠“ ”进行转义处理(转义处理的机制和使用静态模式的转义一致,
返回值:替换后的新字符串。
FILE = A.c B.c
FILE1 = $(patsubst %.c,%.f,$(FILE)) //把FILE变量中的以.c结尾的文件替换.c替换成.f
@echo FILE1= $(FILE1)
7、命令前添加@,只显示命令结果,不显示命令
1)@echo $(A) //打印出变量A的值,但是不显示命令 ,@的作用。
2)@mkdir - p output //创建output文件
8、-std=c++11
This mode can be selected with the -std=c++11 command-line flag, or -std=gnu++11 to enable GNU extensions as well.
-std=c++11,支持C++11标准;
-std=gnu++11,支持C++11标准和GNU扩展特性;
9、makefile默认的变量
CC = gcc
CFLAGS = -g
默认变量CC 就是gcc,即使我们此处不赋值,使用时,直接用$(CC)也是可以使用的。
CFLAGS为默认的gcc编译参数变量。