Skip to content

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/.cxxC++原始程序
.h预处理文件(头文件)
.mObjective-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进行静态编译,即链接静态库,禁止使用动态库
-shared1.可以生成动态库文件 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 | 自动化配置工具

咕咕咕?

Copyright © 2022 田园幻想乡 浙ICP备2021038778号-1