赞
踩
常见的GNU编译器是GCC其包含gcc以及g++等,适用于C/C++中,在Windows系统中通常使用IDE进行程序的编写和编译、链接等操作,但在Linux系统中通常使用GNU编译器来进行,对于C/C++等高级语言需要进行预编译、编译、汇编、链接最后才能生成可执行文件使用。实际使用直接g++ test.cpp -o test.out && ./test.out
生成可执行文件test.out
并运行,如果不用-o指定生成名称的话即g++ test.cpp && ./a.out
则默认生成a.out
。
GNU编译器基本选项 | 说明 | 实例 |
---|---|---|
-E | 预编译:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法; 生成.i预处理文件 | g++ -E test.cpp -o test.i |
-S | 编译:检查语法,将预处理后文件编译,生成.s汇编文件 | g++ -S test.i -o test.s |
-c | 汇编:将汇编文件生成目标文件(二进制文件); 生成.o文件(机器码) | g++ -c test.s -o test.o |
-o | 链接、指定输出文件的名称。当与编译和链接命令一起使用时,它指示编译器或链接器将最终的可执行文件或库输出到指定的文件名 | g++ test.o -o test.out |
-D | 程序编译时,指定一个宏定义 | g++ test.cpp -o test.out -D MAX_NUM |
-w | 编译时不生成任何警告 | g++ test.cpp -o test.out -w |
-Wall | 编译时生成全部警告 | g++ test.cpp -o test.out -Wall |
-std | 指定编译的标准 | g++ -std=c++11 test.cpp -o test.out |
-I(大i) | 指定include头文件所在目录 | ---- |
-l(小L) | 编译时指定使用到的库 | ---- |
-L | 编译时指定库的路径 | ---- |
-g | 编译时生成调试信息,可以进行调试 | ---- |
一个项目通常有多个源文件,如果要使用GNU编译器逐个编译的话则十分复杂例如g++ a.cpp b.cpp c.cpp d.cpp -o test.out
所以使用Makefile文件对编译的规则进行封装,指定不同源文件的编译顺序以及编译规则,最后使用make命令进行自动编译,当前目录下使用make命令会自动进入Makefile文件并按照其中规定的规则进行编译。
目标 ...(可以多个):依赖 ...
命令(必须TAB缩进)
...
...
test.out:a.cpp b.cpp c.cpp d.cpp
g++ a.cpp b.cpp c.cpp d.cpp -o test.out
目标即最终要生成的文件例如test.out
依赖则是生成目标所需要的文件例如a.cpp b.cpp c.cpp d.cpp
命令则对依赖执行操作生成目标例如g++
必须使用TAB缩进
test.out:a.o b.o c.o
g++ a.o b.o c.o -o test.out
a.o:a.cpp //生成依赖a.o规则
g++ -c a.cpp -o a.o
b.o:b.cpp //生成依赖b.o规则
g++ -c b.cpp -o b.o
c.o:c.cpp //生成依赖c.o规则
g++ -c c.cpp -o c.o
var=world $(var) //通过符号$获取变量的内容==world
预定义变量 | 说明 |
---|---|
AR | 归档维护程序的名称,默认为ar |
CC | C编译器名称,默认为cc |
CXX | C++编译器的名称,默认为g++ |
$@ | 目标的完整名称,只可在命令中使用 |
$< | 第一个依赖文件的名称,只可在命令中使用 |
$^ | 所有的依赖文件,只可在命令中使用 |
test.out:a.cpp b.cpp c.cpp d.cpp
$(CXX) $^ -o $@ //等价于g++ a.cpp b.cpp c.cpp d.cpp -o test.out
//可直接使用自定义变量
target=test.out
origin=a.cpp b.cpp c.cpp d.cpp
$(target):$(origin)
$(CXX) $(origin) -o $(target)
%
即为一个通配符,匹配一个字符串。target=test.out
origin=a.o b.o c.o
$(target):$(origin)
$(CXX) $(origin) -o $(target)
%.o:%.cpp //多次匹配生成依赖a.o、b.o、c.o的规则
$(CXX) -c $< -o $@
函数 | 功能 | 参数 | 返回 | 实例 |
---|---|---|---|---|
$(wildcard ..) | 获取指定目录下的指定类型的文件列表 | 某个或多个目录下对应的某种类型的文件,多个目录用空格间隔 | 得到若干个文件的文件列表,文件名使用空格间隔 | $(wildcard ./*.c ./*.o)//获取当前目录所有.c和.o文件 |
$(patsubst . .. ...) | 查找... 中的字符串和. 的字符串是否符合,一致则转化为.. 字符串 | 均可以使用通配符% 表示任意字符串 | 返回被替换后的字符串 | $(patsubst %.c,%.o,a.c b.c c.c )//返回为a.o b.o c.o 仅进行字符串的改变不改变文件的本身属性 |
target=test.out
origin=$(wildcard ./*.c)
index=$(patsubst %.c %.o $(origin))
$(target):$(index)
$(GXX) $(index) -o $(target)
%.o:%.c
$(GXX) -c $< -o $@
.PHONY:clean //伪目标,不会生成文件
clean: //删除所有的.o文件,使用外部命令行使用make clean即可
rm ./*.o //必须使用TAB缩进
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。