Linux编程基础

GCC编译

Gcc通过后缀来区别输入文件的类别:

v.c为后缀的文件:  C语言源代码文件

v.a为后缀的文件是由目标文件构成的库文件

v.C.cc.cxx为后缀的文件:C++源代码文件

v.h为后缀的文件头文件

v.i为后缀的文件:是已经预处理过的C源代码文件

v.ii为后缀的文件:是已经预处理过的C++源代码文件

v.o为后缀的文件是编译后的目标文件

v.s为后缀的文件是汇编语言源代码文件

v.S为后缀的文件是经过预编译的汇编语言源代码文件。

 

编译和运行这段程序

# gcc hello.c -o hello

# ./hello

gcc最基本的用法是

gcc [options] [filenames]

options:编译器所需要的编译选项

filenames:要编译的文件名。

编译选项

gcc编译器的编译选项大约有100多个,其中多数我们根本就用不到,这里只介绍其中最基本、最常用的参数。

v-o output_filename确定可执行文件的名称output_filename。如果不给出这个选项,gcc就给出预设的可执行文件a.out(演示)

v-c只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件。

v-g产生调试工具(GNUgdb)所必要的符号信息,要想对编译出的程序进行调试,就必须加入这个选项。

v-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。

v-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。

-Idirname:dirname所指出的目录加入到程序头文件目录列表中。

C程序中的头文件包含两种情况

#include <A.h>

#include B.h”

对于<>,预处理程序cpp在系统预设的头文件目录(/usr/include)中搜寻相应的文件;而对””,cpp在当前目录中搜寻头文件。这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。

例:gcc foo.c -I /home/include -ofoo

-Ldirnamedirname所指出的目录加入到库文件的目录列表中。在默认状态下,连接程序ld在系统的预设路径中(/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找。

v-lname在连接时,装载名字为libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为libm.a”的数学函数库。

例:gcc foo.c -L /home/lib -lfoo-o foo

v-Wall生成所有警告信息

v-w不生成任何警告信息

v-DMACRO定义MACRO宏,等效于在程序中使用#define MACROGDBGNU发布的一款功能强大的程序调试工具。

GDB快速进阶

1.编译生成可执行文件:

gcc -g tst.c -o tst

2.启动GDB

gdb tst

3.main函数处设置断点

break main

4.运行程序

run

5.单步运行

next

6.继续运行

continue

启动GDB

1. gdb调试程序名

例:gdb helloworld

2. gdb

file 调试程序名

GDB命令(演示)

vlist(l) 查看程序

vbreak(b)函数名在某函数入口处添加断点

vbreak(b)行号在指定行添加断点

vbreak(b)文件名:行号在指定文件的指定行添

加断点

vbreak(b)行号if条件当条件为真时,指定行号

处断点生效,例b 5 if i=10,当i等于10时第5

断点生效

vinfo break 查看所有设置的断点

vdelete断点编号删除断点

vrun(r) 开始运行程序

vnext(n) 单步运行程序(不进入子函数)

vstep(s) 单步运行程序(进入子函数)

vcontinue(c)继续运行程序

vprint(p)变量名查看指定变量值

vfinish 运行程序,直到当前函数结束

vwatch变量名对指定变量进行监控

vquit(q) 退出gdb

GNU make

Makefile(术语)

规则:用于说明如何生成一个或多个目标文件,规则格式如下:

targets : prerequisites

command

目标依赖命令

main.o : main.c

gcc –c main.c

目标?依赖?命令?

make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:

make–f文件名

Makefile中把那些没有任何依赖只有执行动作的目标称为“伪目标”(phonytargets)。

.PHONY : clean

clean :

rm –f hello main.o func1.o func2.o

.PHONY将“clean”目标声明为伪目标

变量

makefile中,存在系统默认自动化变量

$^:代表所有的依赖文件

$@:代表目标

$<:代表第一个依赖文件

例:

hello: main.o func1.o func2.o

gcc main.o func1.o func2.o -o hello

=

hello: main.o func1.o func2.o

gcc $^ -o $@

Makefile中“#”字符后的内容被视作注释。

hello: hello.c

@gcc hello.c –o hello

@:取消回显

 

 

原文地址:https://www.cnblogs.com/owenyang/p/3579130.html