Linux学习笔记03——C编程环境

简介

概述

  • Linux下一般使用C语言编写系统程序以及对性能要求较高的程序
  • Linux通常使用gcc套件编译程序,运用gdb/ddd调式工具进行调试与排错

学习目标

  • 理解Linux C程序的编译、执行过程,gcc命令选项,自定义函数库的制作
  • 熟悉Linux C程序中编程错误的诊断与处理方法
  • 熟悉使用Linux自带的字符串运算、排序算法、二叉树算法库编写应用程序
  • 熟悉使用gdb/ddd调式Linux C程序
  • 掌握利用命令行参数和环境变量给程序提供数据
  • 能够使用make工具管理大型C/C++编程项目

3.1 Linux C程序的编译与执行

3.1.1 Linux环境下C程序的编译与执行过程

示例:

  • 用vi或gedit创建hello,c程序

  • 编译 gcc hello.c

Linux学习笔记03——C编程环境_第1张图片

  • 执行

gcc用法

gcc [选项] 文件名称

 gcc处理过程:

Linux学习笔记03——C编程环境_第2张图片

 (1)预处理阶段

示例:

  • 创建test.c

Linux学习笔记03——C编程环境_第3张图片

  • 带命令选项-E的gcc命令调用预处理程序cpp,对源程序进行预处理

  • 查看test.i

Linux学习笔记03——C编程环境_第4张图片

预编译阶段的工作:

  • 调用预处理程序gcc(对.c进行预处理)
  • 扫描源代码,检查其中的宏定义与预处理指令
  • 执行行替换,展开包含文件,删除程序中的注释及多余空白字符

(2)编译阶段

示例:

  • 带-S的gcc编译ccl

  • 查看test.c

 Linux学习笔记03——C编程环境_第5张图片

编译阶段工作:

  • 带-S的gcc命令进行编译(对.c或.i源程序进行编译)
  • 产生汇编语言代码

(3)汇编阶段

 示例:

  • 带-c进行汇编

  • 查看.o文件

  • nm命令查看test.o文件中的符号

汇编阶段工作:

  • 带-c的gcc调用汇编程序as
  • 将上一步产生的汇编代码汇编成目标机器指令
  • 生成与源程序同名的.o目标代码文件 

(4)链接阶段

示例:

  • 使用gcc链接

  • 使用nm查看test文件中的符号

 链接阶段工作:

  • 使用gcc进行预处理、编译、汇编、并调用链接程序collect2
  • 将一个或多个目标代文件与相关库文件链接起来,形成可执行文件

3.1.2 编译多个源文件

  • 假定由四个源文件

calc.h

aver.c

sum.c

libtest.c

Linux学习笔记03——C编程环境_第6张图片

  • 将四个源文件按构成一个项目

方式一:分开编译前三个文件生成目标代码文件,然后链接产生可执行文件libtest

Linux学习笔记03——C编程环境_第7张图片

方式二:在一条命令中完成三个文件的编译与链接

3.1.3 使用头文件和库文件

库文件是由一些提供公共功能的函数、代码、变量定义的二进制代码文件,可以被各种应用调用,链接到它们的可执行程序中

函数库里有Linux自带库函数、第三方库函数和用户自定义库函数。

为了让程序正确编译链接和执行,需要做三件事情:

  • 用"#include"语句将这些库函数的原型、相关类型定义的头文件添加到源程序前面
  • 在gcc链接命令中用-l选项,指明包含API或库函数代码实现的库文件
  • 有时需要用-I选项和-L选项分别指定第三方库函数的头文件和库文件所在目录

示例:math1.c

  • 创建math1.c

Linux学习笔记03——C编程环境_第8张图片

  • 编译并执行

Linux学习笔记03——C编程环境_第9张图片

说明:自带库函数不需要链接也能正确执行,但调用了其他种类的库函数,如例子中调用了数学运算函数,就需要使用-l选项。

3.1.4 使用gcc创建自定义库文件

以aver.c与sum.c为例,用到的文件如下

aver.c

sum.c

calc.h

libtest.c

Linux学习笔记03——C编程环境_第10张图片

 (1)静态库文件的创建与使用

  • 使用带-c选项的gcc命令将其变成.o文件

  • 使用ar命令生成静态库文件libmycalc.a

说明:

 libmycalc.a是静态库文件的名称,必须以lib开头;

参数r表示将目标文件加入静态库中;

参数c表示创建新的静态库文件。

  • 调用生成的静态库文件libmycalc.a将它链接

说明:

-Bstatic选项强制gcc使用静态库链接,将libmycalc.a中的代码复制到可执行文件libtesta中;

-L.将当前文件目录.添加到库文件搜索路径中; 

-lmycalc表示寻找名为libmycalc.a的库文件

-o指定可执行程序的名字

 (2)动态库文件的创建与使用

  • 生成源程序的目标文件

说明:

参数-fPIC表示生成位置无关代码 

  • 创建共享库libmycalc.so

说明:

shared参数告诉gcc生成共享库 

  • 由于链接的是动态库,aver与sum代码并未复制到可执行文件中,需要在libtestso执行过程中加载动态库文件libmycalc.so,告知动态库文件的位置。查看执行结果

说明:

告知动态库文件方式有两种:

第一种将共享库路径添加到环境变量LD_LIBRARY_PATH中

第二种将自定义动态库添加到/etc/ld.so.conf中

这里采用第一种 

  • 如将共享库删除,运行程序报错

3.2 Linux常用自带系统库

3.2.1 数学函数

Linux学习笔记03——C编程环境_第11张图片

3.2.2 环境控制函数

Linux学习笔记03——C编程环境_第12张图片

3.2.3 字符串处理函数

Linux学习笔记03——C编程环境_第13张图片

Linux学习笔记03——C编程环境_第14张图片

3.2.4 时间函数

Linux学习笔记03——C编程环境_第15张图片

3.2.5 数据结构算法函数

Linux学习笔记03——C编程环境_第16张图片

Linux学习笔记03——C编程环境_第17张图片

举例:对整型数组进行排序

  •  创建qsorttest.c

Linux学习笔记03——C编程环境_第18张图片

  • 编译并执行

3.3 诊断与处理Linux编程错误

1、 错误分类

Linux学习笔记03——C编程环境_第19张图片

 2、常见编译处理分类

Linux学习笔记03——C编程环境_第20张图片

3.4 命令行参数和环境变量的读取方法

数据传递给Linux的四种方式:

  • 通过scanf,getchar等数据输入函数输入数据
  • 用read、fread等函数从磁盘文件中读入数据
  • 通过环境变量输入数据
  • 通过命令行参数输入数据

3.4.1 环境变量及其使用方法

  • 环境变量可分为系统预定义与用户自定义两种
  • 环境预定义有当前工作目录PWD和系统命令搜索路径PATH等,变量名通常为大写字母构成的字符串
  • 自定义环境变量是由自己创建的环境变量
  • 创建环境变量的格式: export 环境变量名=环境变量值,如:export PHONE=076-12345678
  • 引用环境变量的方法是在变量前加$,如:echo $PHONE
  • 如果变量名与其他非空字符紧贴在一起,那么在引用环境变量时应该用花括号将环境变量名括起来。如:echo ${PHONE}

示例:(envtest.c)

  • 创建envtest.c:

Linux学习笔记03——C编程环境_第21张图片

  • 测试: 

Linux学习笔记03——C编程环境_第22张图片

3.4.2 命令行参数的使用方法

 命令行中的参数也可以被C程序读取,只要把main()原型改成int main(int argc, char *argv[])。argc为命令行参数个数,argv[]为执行各参数字符串指针

示例:(cmdpar.c)

  • 创建cmdpar.c

Linux学习笔记03——C编程环境_第23张图片

  • 测试

Linux学习笔记03——C编程环境_第24张图片

你可能感兴趣的:(linux,学习)