Linux 下 C 语言编程概述
目录
本章将介绍 vim,emacs,GCC,GBD 等 C 语言开发工具的使用方法,以及 Linux 下 C 语言编程的基本概念。
C 语言编译流程
shell
源代码.c
↓
预处理器(gcc -E) <- 头文件.h
↓
源代码.i
↓
编译器(gcc -S)
↓
汇编代码.s
↓
汇编器(gcc -c)
↓
目标文件.o
↓
链接器(gcc) <- 引导代码 库函数
↓
可执行文件
GCC | C 语言编译器
GNU CC(简称为 gcc)是 GNU 项目中符合 ANSI C 标准的编译系统,能够编译用 C、C++和 Object C 等语言编写的程序
c
// hello.c
#include <stdio.h>
int main()
{
printf("Hello! This is our embedded world!\n");
return 0;
}
shell
# 预处理 将头文件中的内容替换到源文件中
gcc -E hello.c -o hello.i
# 编译 将预处理后的文件编译成汇编文件
gcc -S hello.i -o hello.s
# 汇编 将汇编文件编译成目标文件(二进制文件)
gcc -c hello.s -o hello.o
# 链接 将目标文件和库文件链接成可执行文件
gcc hello.o -o hello
GCC 支持编译的文件
文件后缀 | 文件类型 |
---|---|
.cC | 原始程序 |
.s/.S | 汇编语言原始程序 |
.C/.cc/.cxx | C++原始程序 |
.h | 预处理文件(头文件) |
.m | Objective-C 原始程序 |
.o | 目标文件 |
.i | 已经过预处理的 C 原始程序 |
.a/.so | 编译后的库文件 |
.ii | 已经过预处理的 C++原始程序 |
GCC 常用选项
-E
:只进行预处理,不进行编译、汇编和链接-S
:只进行编译,不进行汇编和链接-c
:只进行编译和汇编,不进行链接-o <filename>
:指定输出文件名(需要后缀)-g
:生成调试信息-v
: 打印出编译器内部编译各过程的命令行信息和编译器的版本- ‵-I <dir>`: 添加额外的头文件目录,编译器会去对应的目录找头文件
gcc test.c -o test.i -E 这样也是可以的(-E 放在后面)
GCC 库选项
选项 | 含义 |
---|---|
-static | 进行静态编译,即链接静态库,禁止使用动态库 |
-shared | 1.可以生成动态库文件 2.进行动态编译,尽可能地链接动态库,只有当没有动态库时才会链接同名的静态库(默认选项,即可省略) |
-L dir | 在库文件的搜索路径列表中添加 dir 目录 |
-lname | 链接称为 libname.a(静态库)或者 libname.so(动态库)的库文件。若两个库都存在,则根据编译方式(-static 还是-shared)而进行链接 |
-fPIC(或-fpic) | 生成使用相对地址的位置无关的目标代码(Position Independent Code)。然后通常使用 gcc 的-static 选项从该 PIC 目标文件生成动态库文件 |
gcc 警告和出错选项选项列表
选项 | 含义 |
---|---|
-ansi | 支持符合 ANSI 标准的 C 程序 |
-pedantic | 允许发出 ANSI C 标准所列的全部警告信息 |
-pedantic-error | 允许发出 ANSI C 标准所列的全部错误信息 |
-w | 关闭所有告警 |
-Wall | 允许发出 gcc 提供的所有有用的报警信息 |
-werror | 把所有的告警信息转化为错误信息,并在告警发生时终止编译过程 |
GDB | 调试器
可以断点调试,查看变量的值,查看函数的调用栈等
shell
# 编译时加上 -g 选项
gcc -g hello.c -o hello
# 进入调试模式
gdb hello
# 设置断点
b main
# 运行程序
r
# 单步执行
n
# 查看变量的值
p 变量名
# 查看函数的调用栈
bt
# 退出调试
q
咕咕咕?
makefile | 自动化编译工具
makefile 是一种自动化编译工具,可以自动化编译程序,提高编译效率。
makefile 可以根据文件的修改时间来判断是否需要重新编译,如果文件没有修改,就不会重新编译。
makefile
# makefile
# target(目标文件): dependencies
hello:hello.c
# command
gcc -g hello.c -o hello
shell
# 编译
make
# 清除编译生成的文件
make clean
autoconf | 自动化配置工具
咕咕咕?