GCC是GNU推出的功能强大、性能优越的多平台编译器,gcc可以在多种硬件平台上编译出可执行程序
能将C、C++、汇编编译链接成可执行文件
Linux没有文件后缀,而是看属性来判断能否执行
hello world例程
#include
void main()
{
printf("Hello World!\n");
}
[gyy@localhost gcc]gcc hello.c -o hello
[gyy@localhost gcc]./hello
Hello World!
gcc [option] [filenames]
option
-o :output_filename确定可执行文件的名称为output_filename,如果不给出则为a.out
-c :只编译,不连接成为可执行程序,编译器只是由输入的.c源代码生成.o为后缀的目标文件
-g :产生调试工具(gdb)所必要的符号信息,要想进行调试就必须加
-O : 对程序进行优化编译、链接,提高执行效率,但编译链接速度变慢
-O2 :优化的更彻底,速度更慢
-I :将dirname所指出的目录加入到程序头文件目录列表中(大写的i)
-L :将direname所指出的目录加入到库文件的目录列表下,在默认状态下连接程序ld在系统的预设路径下(/usr/lib)寻找所需的头文件,这个选项告诉链接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找
-lname:在链接时装在名字为“libname”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下,例如,-lm表示链接名为“libm.a”的数学函数库(小L)
-static:静态链接库文件,动态链接以so,静态为o
-Wall:生成所有警告信息
-w :不生成任何警告信息
-DMACRO :定义MACRO宏
/usr/include
也可以制定一个目录,gcc会在那个目录中寻找头文件
[gyy@localhost gcc]$ gcc -I /home/gyy/study/program/ hello.c -o hello
区别在于是否将库拷贝
是GNU发布的一款功能强大的程序调试工具
启动被调试程序
让被调试的程序在指定的位置停住
当程序被停住时,可以检查程序状态(如变量值)
很多图像化的调试器的核心都是GDB
gdb 文件名:开始进行调试
gdb : file 文件名
l/list 列出程序
break(b) 函数名 在函数入口打断点
break(b) 行号 在指定行添加断点
break(b) 文件名:行号 在指定文件的指定行添加断点
break(b) 行号 if 条件 当条件为真时在指定行添加断点
(gdb) b 5
Breakpoint 1 at 0x400525: file tst.c, line 5.
(gdb) b 9 if i=10
Breakpoint 2 at 0x400536: file tst.c, line 9.
info breakpoints 查看断点
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400525 in main at tst.c:5
2 breakpoint keep y 0x0000000000400536 in main at tst.c:9
stop only if i=10
delete 断点编号 删除断点
(gdb) delete 1
(gdb) delete 2
(gdb) info breakpoints
No breakpoints or watchpoints.
run 运行程序
next 单步运行,遇到子函数跳过
step 单步,遇到子函数会进入函数内部
continue 继续运行
print 查看变量值
finish 运行程序知直到当前函数结束
watch 监控变量
quit 退出
GNU的Make能够使整个软件工程的编译、链接只需要一个命令就可以完成
Make在执行前,需要一个命名为Makefile的文件,Makefile文件描述了整个文件的编译,链接规则。
其中包括:工程中的那些源文件需要编译以及如何编译;需要创建哪些库文件以及如何创建这些库文件;如何最后产证我们想要的可执行文件
在Makefile中规则的顺序是很重要的,Makefile中只应该有一个最终目标,其他目标都是被这个目标所连带出来的,第一条规则中的目标将被确立为最终目标
make命令默认在当前目录下寻找名字为Makefile或makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:
make -f 文件名
[gyy@localhost gcc]$ mv makefile testmakefile
[gyy@localhost gcc]$ make
make: *** No targets specified and no makefile found. Stop.
[gyy@localhost gcc]$ make -f testmakefile
make: `hello' is up to date.
[gyy@localhost gcc]$ ./hello
Hello World!
Makefile中把那些没有任何依赖只有执行动作的目标成为“伪目标”(phony targets)
.PHONY : clean
clean:
rm -f hello main.o func1.o fun2.o
更好的使用方法
$^:代表所有的依赖文件
$@:代表目标
$<:代表第一个依赖文件
有回显
[gyy@localhost gcc]$ make
gcc hello.c -o hello
关闭
hello:hello.c
@gcc hello.c -o hello
[gyy@localhost gcc]$ make