目录

  • gcc编译器
  • 函数库
    • 静态库
      • 创建静态库
    • 动态库(共享库)
      • 创建动态库
  • make工程管理
    • make的使用
    • Makefile文件编写
  • gdb调试工具

gcc编译器

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

gcc的编译过程:

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

gcc支持编译的后缀名

后缀名 对应语言 后缀名 对应语言
.c C原始程序 .ii 已经经过预处理的C++原始程序
.C C++原始程序 .s 汇编语言原始程序
.cc C++原始程序 .S 汇编语言原始程序
.cxx C++原始程序 .h 预处理文件(头文件)
.m Object-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.ogcc sayhello.c myprint.o -o sayhello
myprint.o:myprint.cgcc 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 退出调试

LinuxC语言开发工具相关推荐

  1. c++整理程序 dev_C编程从入门到实践:C语言开发工具详解(2)

    DEV C++是一款经典的轻量级C语言开发工具,其安装大小只有几十兆,并且具有图形视图界面,操作比较容易.在DEV C++编码界面中可以使用复制和粘贴等命令,这提高了开发效率. 2.3.1安装DEV ...

  2. C语言开发工具(编译器|IDE)推荐

    常用的C语言开发工具有很多,每个开发工具所支持的库函数和对标准的实现都有差异.不过,对于初学者,可以忽略这些细节,选择一款使用广泛.上手容易的开发工具才是王道. Windows平台下推荐VC6.0或V ...

  3. Go 语言开发工具 LiteIDE X36 发布

    Go 语言开发工具 LiteIDE X36 发布,新增了编辑器路径导航工具栏,重构了 QuickOpen 插件,优化了快速打开文件和目录功能. ### 2019.03.15 Ver X36 * Lit ...

  4. L1D1:嵌入式Linux C语言开发工具及基础命令

    嵌入式Linux C语言开发工具及基础命令 一.ubuntu环境搭建 请自行准备VMware workstation15安装包 及 ubuntu18.04.iso镜像文件.可参考链接:VMware W ...

  5. 五款最棒的Go语言开发工具?

    新一代编程神语言Go, 由于其同时提供了开发效率与运行效率, 可谓是近几年在编程界最耀眼的新星, 越来越多的大神投入其中, 也越来越成熟, 开源库代码越来越多. 想必现在也有不少新手,或者有其他语言开 ...

  6. Go语言开发工具和插件

    目录 Goland IntelliJ Idea Eclipse Goland GoLand: A Clever IDE to Go by JetBrains IntelliJ Idea File> ...

  7. devc 如何编写java,Android For JNI(1)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序...

    Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...

  8. 【C语言从零到入门】第二节 C语言开发工具的安装

    工欲善其事,必先利其器. 要想学习C语言,第一步当然是安装C语言的开发工具,我们在这里选择Dev-C++作为开发工具 为什么选择Dev-C++ ? 小巧,Dev-C++的安装包仅48MB,且对电脑的配 ...

  9. C语言开发工具(开发环境)

    C语言开发工具(开发环境)   可以根据您的喜好选择下面任一款开发工具: Editplus+GCC/VC6 编译环境(绿色免安装版) (强烈推荐) Dev C++ 5.0 多国语言版 (4.9.9.2 ...

最新文章

  1. 人脸对齐--Face Alignment In-the-Wild: A Survey
  2. 查询出某个表依赖于某个表的外键,进行遍历删除操作
  3. python操作js中的输入_Python调用JavaScript代码的方法
  4. day17.Python中lambda表达式应用
  5. python3:(unicode error) 'utf-8' codec can't decode
  6. 计算char,short,int,long类型变量的取值范围
  7. docker 中用docker 启动应用访问docker中的mysql
  8. python批量下载文件教程_Python抓包菜鸟教程:批量下载图片的方法,电脑和手机都能用...
  9. laravel auth::check 后session失败_01.laravel简介
  10. Linux操作系统——vi文本编辑器
  11. [poj3580]SuperMemo(splay终结题)
  12. 锐捷服务器系统安全,更安全 锐捷网络发布RG-ESS易安全系统
  13. 高德地图开发-- 自定义图标
  14. 将加密的ppt文档解密,使之可以编辑
  15. EPICS记录参考--Sequence记录(seq)
  16. Cadence Virtuoso IC617从原理图建立器件和生成版图
  17. 输入三角形的三边长,如果能构成三角形,计算三角形的周长和面积
  18. RF框架----基础
  19. 报错:‘gbk‘ codec can‘t decode byte 0x98 in position
  20. 【TWVRP】模拟退火算法求解带时间窗的车辆路径规划问题【含Matlab源码 160期】

热门文章

  1. mysql 线程池大小设置_MySQL线程池参数解析
  2. html 引入地址地址,jQuery 在线引用地址
  3. 火狐等浏览器启动被2345等网站劫持的解决方案
  4. Json与字符串之间的转换
  5. 关于iPhoneX适配以及面容ID(FaceID)使用
  6. CF:1674 G. Remove Directed Edges
  7. 从 BIO、NIO 聊到 Netty,最后还要实现个 RPC 框架!
  8. 怎么换账号服务器地址,用户如何更换云服务器的ip?
  9. 选股公式1000问--76
  10. 《JSDOM编程艺术》笔记