gcc是GNU的C编译器(GNU C Compiler)
g++是GNU的C++编译器(GNU C++ Compiler)
gdb是Linux下常用的调试工具,主要功能如下
启动程序,按照自定义的要求运行程序。
让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式)。
当程序被停住时,可以检查此时程序中所发生的变化。
修改程序,对发现的BUG进行测试验证与修复。
Makefile文件:Makefile是程序编译的规则,makefile记录着整个工程的编译规则(如源文件的编译顺序、依赖关系等),通过make工具进行编译。make根据makefile定义的规则将源代码编译成二进行文件。在跨平台(特别是类Unix系统中)的程序中,一般都会通过makefile来进行编译。
$ g++ main.cpp #编译程序,在当前目录自动生成一个a.out
的可执行文件
$ ./a.out # 执行可执行文件,即运行程序
$ g++ main.cpp -o test # 指定自己想要生成的可执行程序的别名 (test)
$ g++ -c main.cpp # 将源代码编译成目标文件(main.o),不进行链接,即生成.o文件
$ g++ main.o -o test1($ g++ -o test1 main.o) #g++对编译后的(*.o)文件进行链接,生成可执行程序 (test1)
$ ldd test1 #查看可执行程序 (test1)所链接的库
$ g++ -o test1 main.cpp -L /usr/Lib -l /usr/include #将依赖的函数库和库路径加入
-L:指定连接的动态库或者静态库路径 ;
-I:(大写i) 指定头文件路径 ,即include文件(也就是包含的*.h头文件)所在的目录;
-l:(小写L) 指定需要链接的库的名称
$ gcc -g main.c -o test #使用gdp调试C/C++程序, 在编译时,必须要把调试信息加到可执行文件中
$ g++ -g main.cpp -o test
注: 编译过程包括预处理、编译,链接 ;linux系统上的编译生成.o文件,windows系统上的编译生成.obj文件 ;linux系统上生成没有后缀的可执行文件,windows系统中生成.exe文件 ; linux系统下的静态函数库的后缀是.a,动态库是.so ; windows系统下的静态函数库的后缀是.lib,动态库是.dll。
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。可以用来调试C,C++程序。
gdp功能及其常用命令
命令形式 | 功能解释 |
---|---|
gdb -g main.cpp -o test | 编译代码时的命令,要把调试信息加到可执行文件中 |
gdb | 进入gdb调试命令 |
help | 显示帮助信息,例:help quit,显示quit命令的信息 |
q/quit | 退出GDB调试 |
file test | 加载被调试的可执行程序文件test;或者直接使用gdb ./test进行debug调试命令 |
l/list | 列出文件的内容 |
b/break |
在某一行设置普通断点,运行到该行即停止,例:b 7 |
b/break |
在某一行设置条件断点,运行到该行满足条件即停止,例:b 7 if index=2 |
b/break |
在某一个函数调用处设置断点,运行到函数调用出即停止,例:b getSum |
r/run | 运行调试的程序(如果程序中没有设置断点,则程序会一直运行到结束或者出现异常结束,如果设置断点,则会在断点处停止) |
d/delete |
删除断点编号对应的断点,例:d 1 |
clear | 清空所有的断点信息 |
start | 开始调试 |
c/continue | 继续执行程序直到下一个断点或者程序结束 |
n/next | 逐行调试 |
s/step | 遇到函数时进到函数内部调试 |
p/print |
显示变量的值,即查看变量数据,例:p index |
Makefile文件是整个工程的编译规则,它定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,其就像一个脚本一样,它也可以执行操作系统的命令。Makefile的便利之处在于其“自动化编译”,一旦写好,只需一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具, 在终端中输入make命令,会自动搜索当前路径下的makefile或者是Makefile文件 。
(1)Makefile示例1及分析
edit:main.o test.o #需要生成的目标:生成目标的依赖项
g++ main.o test.o -o test #以Tab键开始,具体要执行的命令
test.o:
g++ -c test.cpp
main.o:
g++ -c main.cpp
clean:
rm main.o test.o
makefile书写规则包含两个部分:依赖关系和生成目标的方法。
示例1make工作过程解释:
以上是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在寻找的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make 就会直接退出,并报错,而对于所定义的命令的错误或是编译不成功,make根本不理,make 只管文件的依赖性。
(2)Makefile示例2及分析
#################################################
# Example for call LTP libraries under UNIX #
#################################################
cc=g++
ccflags=-O2
all: cws \
pos
cws: cws.cpp
${cc} ${ccflags} -o cws cws.cpp -I./ \
-I../include/ \
-I../thirdparty/boost/include \
-L../lib/ -lsegmentor -lboost_regex
pos: pos.cpp
${cc} ${ccflags} -o pos pos.cpp -I./ \
-I../include/ \
-L../lib/ -lpostagger
.PHONY: clean
clean:
rm cws
rm pos
(3)Makefile编写规则
注:在Makefile中的命令,必须要以[Tab]键开始。
(4)make工作时执行过程
(5)makefile文件中使用通配符
如果想定义一系列比较类似的文件,可以使用通配符。make支持三种通配符:“*”,“?”和“[...]”;通配符可以代替一系列的文件,如“*.cpp”表示所有后缀为cpp的文件。一个需要我们注意的是,如果我们的文件名中有通配符,如:“*”,那么可以用转义字符“\”,如“\*”来表示真实的“*”字符。
(6)Makefile中的-Wall -O2 -Os -g等选项介绍
(1)make的运行
直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。
(2)make的退出
make命令执行后有三个退出码: