编译程序-GCC

1、流程图

clipboard.png

2、编译流程

1. 预处理阶段(Pre-Processing)

功能:插入源文件包含的头文件代码和替换源文件中的宏定义代码
  • 命令c++

    gcc -E hello.c -o hello.i
  • 源文件
    clipboard.png
  • 预处理代码
    clipboard.png

2. 编译阶段(Compiling)

功能:将预处理代码转换为汇编代码
  • 命令函数

    gcc -S hello.i -o hello.s
  • 汇编文件
    clipboard.png

3. 汇编阶段(Assembling)

功能:将汇编代码转换为机器代码
  • 命令spa

    gcc -c hello.s -o hello.o
  • 目标文件
    clipboard.png

4. 连接阶段(Linking)

功能:将各个目标件连接为可执行程序
  • 命令.net

    gcc hello.o -o hello
  • 可执行文件
    clipboard.png

3、应用场景

clipboard.png

1. 编译单文件可执行程序

  • 文件结构调试

    • 源文件 hello.c
    • 目标文件 hello
  • 命令c++11

    # 最简单的可执行文件
    gcc hello.c -o hello
    
    # 带调试信息和编译警告的可执行文件
    gcc -g -Wall hello.c -o hello

2. 编译多文件可执行程序

  • 文件结构code

    • 源文件 main.c math.c
    • 目标文件 main
  • 命令blog

    # 直接指定源文件与目标文件
    gcc main.c math.c -o main

3. 编译静态库

  • 文件结构ip

    • 头文件 math.h
    • 源文件 math.c
    • 目标文件 libmath.a
  • 命令内存

    # 第一步:生成目标文件
    gcc -c math.c -o math.o
    
    # 第二步:建立静态库
    ar crv libmath.a math.o
  • 查看静态库
    clipboard.png

    # 查看 math.o 函数列表
    nm math.o
    
    # 查看 libmath.a 函数列表
    nm libmath.a

4. 编译动态库

  • 文件结构

    • 头文件 math.h
    • 源文件 math.c
    • 目标文件 math.so
  • 命令

    # -fPIC 
    gcc math.c -fPIC -shared -o math.so
  • 说明

    • -fPIC:做用于编译阶段,告诉编译器产生与位置无关代码,所有使用相对地址。代码能够被加载器加载到内存的任意位置,均可以正确的执行。
    • –shared:指明编译成动态库

5. 编译使用静态库的可执行程序

  • 文件结构

    • 源文件 main.c libmath.a
    • 目标文件 main
  • 命令

    # 需指定静态库目录和静态库名称
    gcc main.c -L. -lmath -o main
  • 说明

    • -L:指定静态库寻找路径(.表示当前目录)
    • -l:指定静态库名称(libmath.a对应库名引用为math)
    • 路径和文件后必须紧跟参数,不能有空格。

6. 编译使用动态库的可执行程序

  • 文件结构

    • 源文件 main.c math.so
    • 目标文件 main
  • 命令

    # math.so 与 main.c 位于同一目录
    gcc main.c -Wl,-rpath='.' math.so -o main
  • 说明

    • -Wl 表示编译器将后面的参数传递给连接器 ld
    • 经过 -Wl,-rpath='' 指定动态库搜索路径,.表示当前目录
    • 默认搜索目录为 lib 和 /usr/lib
    • 采用 rpath='.' 则优先在同级目录搜素,而后再到系统目录搜索。

7. 编译使用静态库和动态库的可执行程序

8. 编译使用多个静态库和动态库的可执行程序

9. 编译使用pkgconfig的c++11可执行程序

4、编译选项

  • 添加加调试信息

    gcc -g xxx.c
  • 使用c++11标准编译

    g++ -std=c++11

5、参考资料

*Linux环境下多版本编译器(gcc)共存

相关文章
相关标签/搜索