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 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> LinuxC语言开发工具 -> 正文阅读

[系统运维]LinuxC语言开发工具

gcc编译器

gcc 编译器是 Linux 系统下最常用的 C/C++ 编译器,大部分 Linux 发行版中都会默认安装。

gcc的编译过程:

  1. 预处理:主要是加载头文件、进行宏替换、条件编译等
  2. 编译:在确定没有语法和词法错误后将其翻译成汇编代码
  3. 汇编:将编译过程中生成的汇编文件转换成二进制代码
  4. 链接:将目标文件、库文件等链接成可执行文件

gcc支持编译的后缀名

后缀名对应语言后缀名对应语言
.cC原始程序.ii已经经过预处理的C++原始程序
.CC++原始程序.s汇编语言原始程序
.ccC++原始程序.S汇编语言原始程序
.cxxC++原始程序.h预处理文件(头文件)
.mObject-C原始程序.o目标文件
.i已经预处理过的C原始程序.a/.so编译后的库文件

gcc有非常多的编译选项,这里列举几个常用的

  • -o 指定输出文件,默认:a.out
  • -E 仅进行预处理,生成预处理代码(默认输出到屏幕,可通过-o输出到文件)
  • -S 编译到汇编语言,生成汇编代码:*.s
  • -c 将汇编语言翻译到目标代码(也可以直接编译c文件,gcc会根据文件后缀名进行判断),不进行链接,生成目标文件:*.o
  • -g 编译时在可执行文件中插入调试信息,以便gdb进行调试
  • -Wall 显示更多警告信息
  • -O n 优化编译,提高可执行程序的运行速度,n可取值:1,2,3
  • -lx 链接库,对应库文件为libx.so或libx.a,x为库名,与-l之间没有空格
  • I dir 指定额外的头文件搜索位置dir
  • L dir 指定额外的库文件搜索位置dir
  • -static 不使用动态库,编译出的文件较大,但不需要再链接库
  • -share 尽量使用动态库

gcc编译常用格式如下:

gcc C源文件 -o 目标文件

函数库

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

静态库

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

静态库的文件名一般是:*.a

创建静态库

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

ar是一个静态库管理命令。

ar [crv] 库名 文件列表

  • c:创建归档
  • r:把文件合并成一个静态库,如果静态库文件已经存在则更新。
  • v:显示过程信息

使用静态库

  • 直接调用,在gcc的源文件里一起列出
  • 设置LIBRARY_PATH环境变量来指定库的路径,然后在gcc命令中通过参数-lx来指定库名
  • 在gcc参数中指定库文件搜索路径,然后通过参数-lx来指定库名

动态库(共享库)

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

创建动态库

在使用gcc生成目标文件时添加参数–fPIC(生成与位置无关的代码),因为动态库的变量地址是运行时确定的,而不是链接时确定的。

然后使用gcc -shared来创建动态库

gcc -shared -o lib*.so(库名) *.o(目标文件列表)

make工程管理

make是一个"自动编译管理器"

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

make命令将根据Makefile文件的内容来处理依赖关系,只编译需要更新的模块,方便大型项目的管理。

make的使用

由于现在的很多IDE集成了自动生成Makefile文件的功能,因此这里只作简单介绍。

语法

make [选项] [make工程文件]

选项

  • -f makefile 指定规则文件,建议使用默认的Makefile
  • -d 显示调试信息
  • -n 显示命令,但不执行
  • -s 执行命令但不显示任何信息

Makefile文件编写

Makefile的文件格式为:
目标文件列表:依赖文件列表
<TAB>命令列表

  • 目标文件列表:make需要创建的文件
  • 依赖文件列表:编译目标文件所需要的其他文件,make会先去处理依赖文件的编译
  • 命令列表:make执行的动作,通常是编译命令

示例
下面的程序的功能是输入一个名字name,打印"hello,name"

sayhello.c文件内容

#include <stdio.h>
int main(){
    printf("what's your name?\n");
    char name[100];
    scanf("%s", name);
    myprint(name);
    return 0;
}

myprint.c文件内容

#include <stdio.h>
void myprint(char name[]){
    printf("hello,%s\n", name);
}

Makefile文件内容

sayhello:sayhello.c myprint.o
	gcc sayhello.c myprint.o -o sayhello
myprint.o:myprint.c
	gcc myprint.c -c -o myprint.o

下面是执行make命令的输出

gcc myprint.c -c -o myprint.o
gcc sayhello.c myprint.o -o sayhello

运行sayhello文件

>>>what's your name?
<<<jack
>>>hello,jack

修改myprint.c文件

#include <stdio.h>
void myprint(char name[]){
    printf("nice to meet you,%s\n", name);
}

再次执行make命令,下面是输出内容,因为sayhello要重新链接目标文件,所以两条编译命令都执行了

gcc myprint.c -c -o myprint.o
gcc sayhello.c myprint.o -o sayhello

修改sayhello.c文件

#include <stdio.h>
int main(){
    printf("tell me your name\n");
    char name[100];
    scanf("%s", name);
    myprint(name);
    return 0;
}

再次执行make命令,下面是输出内容,这次只执行了一条编译命令,因为myprint.o文件无需更新

gcc sayhello.c myprint.o -o sayhello

gdb调试工具

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

语法

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

选项

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

进入gdb后通过gdb提供的命令来进行调试

  • file 装入待调试的程序
  • kill 终止当前调试的程序
  • list 列出源程序,默认只显示10行,按回车继续显示下10行
  • next 执行一行程序但不进入函数
  • step 执行一行程序但且进入函数
  • run 执行当前程序
  • watch 动态监视指定变量的值,当变量变化时立 即暂停执行
  • print 打印表达式值
  • break n 在第n行上设置断点
  • quit 退出调试
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:57:06  更:2022-06-14 22:58:39 
 
开发: 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年5日历 -2024/5/19 1:29:22-

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