IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux的C开发工具 -> 正文阅读

[系统运维]linux的C开发工具

本文内容:

  1. gcc编译器的使用
  2. 静态库与动态库
  3. Make工程管理文件
  4. gdb调试工具

gcc编译器

编译流程:

源程序(*.c) => 预处理 => 编译 => 汇编 => 链接 => 可执行文件

编译选项:

编译选项功能
-o指定输出文件,默认:a.out
-E仅进行预处理,生成预处理代码(直接输出,可通过-o输出到文件)
-S编译到汇编语言,生成汇编代码:*.s
-c编译汇编到目标代码,不进行链接,生成目标文件:*.o
-g编译时在可执行文件中插入调试信息,以便gdb进行调试
-Wall显示更多警告信息
-O n优化编译,提高可执行程序的运行速度,n可取值:1,2,3
lx链接x链接库,对于库文件为libx.so或libx.a(e.g. lm 链接数学库)
Idir指定头文件的位置
Ldir指定库文件的位置

注意参数顺序:-l(小写L),-I(大写i),-L需在-o和文件名之后

函数库

函数库是一组预先编译好的函数集合,以便重复使用。

静态库:*.a

共享库(动态库):*.so

静态库

在链接阶段,编译器将指定的静态库和程序代码结合生成可执行文件。

创建静态库

将源码编译为目标文件(*.o),然后使用ar创建静态库

ar cr[v]/f 静态库 目标文件列表

c 创建归档

r 将目标文件追加或者替换原有文件

v 显示过程信息

f 显示库文档列表

ar cr libsort.a sort.o parray.o	#通过两个函数的汇编文件建立静态库
ar -t libsort.a	#查看库中文件
gcc -o test main.c -lsort -L	#-L在当前目录下搜索库文件libsort.a
								#得到可执行文件test

共享库

在编译时,并不将函数库的代码插入到可执行程序中,而是将库的引用插入,在执行期动态的加载函数库。

Make工程管理

make命令

在模块化开发中,make来根据程序模块的修改情况重新编译链接目标代码,以保证目标代码总是由它的最新模块组成。

Makefile文件

使用make命令时,必须编写Makefile文件。Makefile描述了软件包中各个文件之间的依赖关系,提供了更新每个文件的命令。

主要内容:显式规则,隐式规则,变量定义,文件指示,注释

make使用

make [选项] [宏] [目标]

-f makefile 指定规则文件,默认Makefile

-d 显示调试信息

-n 显示命令,但不执行

-s 执行命令但不显示任何信息

make规则

make根据make规则执行命令对目标文件进行编译更新,规则保存在规则文件中,默认名为GNUmakefile、makefile或Makefile。
一个Makefile文件主要由一系列的make规则组成,每条规则包含:

目标文件:依赖文件列表
<TAB>命令列表

Makefile文件示例:

#定义变量
CC = gcc
OBJS = main.c
TARGET = test

#搜索源文件,更改文件延展名
SRC = $(wildcard *.c)#搜索.c文件
OBJ = $(patsubst %.c,%.o,$(SRC))#将.c文件转化为.o文件

#添加参数
CFLAGS += -g -Wall --std=c89

#添加链接
LFLAGS += -lm

#链接函数库
$(TARGET) : test.o	#$(OBJ)
	$(CC) $^ $(LFLAGS) -o $@

#编译源文件
test.o : test.c		#将test.c编译为test.o
	$(CC) -c $^ $(CFLAGS) -o $@
#$(OBJ) : $(SRC)
#	$(CC) -c $^ $(CFLAGS) -o $@

#删除文件
clean :
	$(RM) -r $(OBJ) test

#编译、链接时必须次行为Tab
#目标文件 : 依赖文件
#wildcard为搜索,patsubst为替换
#.c为源文件,.o为汇编文件

#抑扬符($^)表示上行所有依赖文件
#艾特($@)  表示上行所有目标文件
#小于符($<)表示第一个依赖文件
#$+  所有的依赖文件,并以空格分开

#使用定义变量时,必须以$()的格式使用
#Makefile 与 makefile 均可使用make命令,但makefile优先级更高,通常使用Makefile

#链接第三方库时,可以用 INC = -I /usr/..../ 方式寻找头文件
#然后可以用(例如) LFLAGS += -lcairo 链接cairo库(绘图)
#也可以采用 LIBS = -L /usr/..../ (路径)进行链接第三方库

#使用Makefile文件时,make命令执行编译,链接,且仅对变化有效
#删除文件时使用make clean命令,RM为Makefile文件自带变量,RM = rm -f

gdb调试工具

跟踪指定程序的运行,给出它的内部运行状态以协助开发者定位程序中的错误。

gdb [选项] [可执行程序]

-n 不执行任何初始化文件中的命令,默认初始化文件为 .gdbinit
-q 安静模式运行,不输出介绍和版权信息
-cd dir 将dir作为调试的工作目录,默认为当前目录

gdb命令

命令作用
file装入待调试程序
set args < 文件名重定向输入文件
list(l)列出源文件,默认显示10行【main函数开始】
next(n)执行下一行程序但不进入函数
step(s)执行下一行程序且进入函数
kill终止当前调试程序
run?执行当前程序
watch动态监视指定变量的值,当变量变化时立即暂停执行
print§打印表达式值
break(b) n在第n行设置断点
quit(q)退出调试
fin结束当前函数
continue?运行到下一个断点
delete n删除第n号断点
info查看状态信息

注意在进行调试的时候,先添加断点,让程序执行可以在某一处停下,随后运行run命令开始调试

b 12 #在第12行添加断点
info breakpoint #查看所有断点编号及位置
delete 1#删除1好断点
p a#查看a的值,或者查看数组a的所有元素
p a[0]@10#查看从a[0]开始的10个元素,当数组内存较大时,不适合采用p a的方法
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 23:07:00  更:2022-04-07 23:07:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:45:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码