Skip to content

编译链接

GCC的编译步骤

gcc编译器将c源文件到生成一个可执行程序,中间一共经历了四个步骤:

四个步骤并不是gcc独立完成的,而是在内部调用了其他工具,从而完成了整个工作流程,其中编译最耗时,因为要逐行检查语法.

下面以test.c为例介绍gcc的四个步骤:

gcc -E test.c -o test.i
gcc -S test.i -o test.s
gcc -c test.s -o test.o
gcc test.o -o test

一步生成最终的可执行程序:

gcc test.c -o test

GCC常用参数

  • -v 查看gcc版本号,--version也可以

  • -E 生成预处理文件

  • -S 生成汇编文件

  • -c 只编译,生成.o文件,通常称为目标文件

  • -I 指定头文件所在的路径

  • -L 指定库文件所在的路径

  • -l 指定库的名字

  • -o 指定生成的目标文件的名字

  • -g 包含调试信息,使用gdb调试需要添加-g参数

  • -On n=0∼3 编译优化,n越大优化得越多

    • 例如:下面代码片段
      c
      int a = 10;
      int b = a;
      int c = b;
      printf("%d",c);
      • 上面的代码可能会被编译器优化成:
        c
        int c = 10;
        printf("%d"10);
  • -Wall 提示更多警告信息

    • c
        int a;
        int b;
        int c = 10;
        printf(“\[%d\]\n”,c);
    • 编译如下:
    • shell
        gcc -o test -Wall test.c
        warning: unused variable ‘b’ [-Wunused-variable]
        warning: unused variable ‘a’ [-Wunused-variable]
  • -D 编译时定义宏

    • test.c文件中的代码片段:
      • printf("MAX==[%d]\n",MAX);
      • 编译:
      • shell
          gcc -o test test.c -D MAX=10    # 相当于#define MAX=10
          gcc -o test test.c -DMAX=10
  • -v 打印编译器的版本信息

编译链接相关命令

汇编

shell
as 源文件 -o 目标文件(一般以.o结尾)
as test.c -o test.o

链接

使用ld命令可以调用静态链接器,把调用的函数和地址关联起来。ld可以把多个 .o 文件、库文件、os引导代码合并起来生成最终的可执行程序。

shell
ld 汇编文件(一般以.o结尾) [其他库文件] -o 目标文件
ld test.o -o test

查看依赖

查看ls程序的依赖关系(ldd只能检查动态依赖)

shell
ldd /bin/ls

查看汇编文件

源文件经过汇编之后生成的 .o 文件使用vim打开之后格式是乱的,我们可以使用下面的命令来调整其格式方便我们查看

shell
# 格式化
:%!xxd

# 取消格式化
:%!xxd -r

列出函数

从目标文件中列出符号表

shell
nm 目标文件
nm test.o
nm test

GDB调试

  • GDB是一个功能强大的命令行调试工具,用于在程序运行时跟踪、检查和修改程序的执行过程。
  • GDB主要用于调试C、C++等语言编写的程序,通过设置断点、单步执行、查看变量等方式来定位并解决程序中的问题。
  • GDB是程序员在开发过程中必不可少的工具之一,可以大大提高调试效率。

想更深入地了解GDB调试,可以从以下几个方面入手:

  • 断点设置: 在程序的特定位置设置断点,让程序在执行到该处时暂停。
  • 单步执行: 一行一行地执行程序代码,观察程序的运行状态。
  • 变量查看: 查看变量的值,检查变量是否按预期变化。
  • 堆栈跟踪: 查看函数调用栈,分析程序的执行流程。

GDB调试的优点:

  • 功能强大: GDB提供了丰富的命令,可以满足各种调试需求。
  • 灵活高效: GDB可以对程序进行细粒度的控制。
  • 跨平台性: GDB可以在多种操作系统上使用。

碍于篇幅限制,更详细的关于GDB调试信息请参考 点击跳转

如果你想了解更多关于GDB调试的信息,可以参考以下资源:

Makefile自动化编译

Makefile文件中定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为Makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

Makefile带来的好处就是——“自动化编译”,一旦写好只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释Makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Visual C++的nmake、Linux下GNU的make。可见,Makefile都成为了一种在工程方面的编译方法。

Makefile文件中会使用gcc编译器对源代码进行编译,最终生成可执行文件或者是库文件。

Makefile文件的命名:makefile或者Makefile

Makefile的核心是

以上只是Makefile自动化编译的简单介绍,详细使用请参考

wd54期中编译链接调试的课件 点击查看