Linux C语言高级编程

发布于 2020-09-01  109 次阅读


编程基础

通过vi来新建 .c文件/通过gedit新建

编译工具GCC,可以将C、C++的源程序、汇编程序编译味执行文件。

如果没有安装可以使用“sudo apt install gcc”来完成安装

编译完成后,用"./"即可运行执行文件

gcc hello.c -o hello #编译hello.c,并命名为hello
./hello              #运行hello执行文件

GCC输入文件类别

  • .c:C语言源代码文件
  • .a:是由目标文件构成的库文件
  • .C,.cc,.cxx:C++源代码文件
  • .h:头文件header
  • .i:C源代码文件(预处理过)
  • .ii:C++源代码文件(预处理过)
  • .o:编译后目标文件
  • .s:汇编语言源代码文件
  • .S:预编译后的汇编语言源代码文件

GCC编译选项f

  • -c:只编译不连接执行文件,即只生成.o的目标文件
  • -g:产生GDB调试工具所必要的符号信息,如需调试必加
  • -O,-O2:对程序优化编译,执行效率会更高,但是编译、链接速度变慢,O2优化程度更好,同理速度更慢
  • -l dirname:将dirname所指的目录加入到头文件目录列表,作用为:在预设目录中搜索不到头文件时,到dirname中寻找。
  • -L dirname:将dirname所指目录加入到库文件的目录中,在连接时首先到dirname中寻找后在到预设路径寻找。
  • -l name:连接时装载名为“libname.a”的函数库,该函数库位于由-L选项确定的目录下 gcc foo.c -L /home/lib -lfoo -o foo
  • -static:静态链接库文件。库有动 态与静态两种 ,动态通常用.so 为后缀,静态 用.a 为后缀 。使用静态库时会找出程序所需函数拷贝到执行文件。动态库则在执行库留下标记,当执行程序时,首先必须载入这个库。动态库更节省空间,缺省操作时默认连接动态库。 gcc –static hello.c -o hello
  • -Wall:生成所有警告信息
  • -w:不生产任何警告信息
  • -D MACRO:定义MACRO宏,等效为 #define MACRO

gcc编译选项约100多个,这里只总结常用的参数

time ./optimize                                                          #time可以在输出结果后输出三个所用时间

GDB

作用:①启动被调试程序②在指定断点位置停住③当程序被停住时,可以检查程序状态。

gcc -g tst.c -o tst #编译生成可执行文件
gdb tst             #启动GDB
break main          #在main 函数处设置断点
run                 #运行程序
next                #单步运行
continue            #继续运行

GBD命令

  • list(l) 查看程序
  • break(b)+名/函数名 在某函数入口处添加断点
  • break(b)+行号 在指定行添加断点
  • break(b)+文件名:行号 在指定文件的指定的指定行添加断点
  • break(b)+行号+if+条件 条件为真时,在制定行号断点
  • info break 查看所有断点
  • delete+断点编号 删除断点
  • run(r) 运行程序
  • next(n) 单步运行程序(不进入子函数)
  • step(s) 单步运行程序(进入子函数)
  • continue(c) 继续运行程序
  • print(p)+变量名 查看变量值
  • finish 运行至结束
  • watch+变量名 监控指定变量名
  • quit(q) 退出gdb

Makefile

makefile文件可以描述整个工程的编译,其格式为:

target:dependency_files
<Tab>command

注意此处必须要有tab,否则make会报错

hello:main.o func1.o func2.o
     gcc main.o func1.o func2.o -o hello 
main.o :main.c
    gcc -c main.c
func1.o:func1.c
    gcc -c func1.c
func2.o:func2.c
    gcc -c func2.c
.PHONY:clean
clean:
    rm -f hello main.o func1.o func2.o

文件编程


不忘初心,牢记始终