c++ 编译过程杂记等

发布于:2024-06-18 ⋅ 阅读:(19) ⋅ 点赞:(0)

开篇一张图。 

编译器 把我们的代码翻译成机器语言

 

 

 

gcc编译程序的过程

gcc编译程序主要经过四个过程:

四个过程说明:

预处理实际上是将头文件、宏进行展开。

编译阶段,gcc调用不同语言的编译器,例如c语言调用编译器ccl。gcc实际上是个工具链,在编译程序的过程中调用不同的工具。

汇编阶段,gcc调用汇编器进行汇编。

链接过程会将程序所需要的目标文件进行链接成可执行文件。汇编器生成的是可重定位的目标文件,学过操作系统,我们知道,在源程序中地址是从0开始的,这是一个相对地址,而程序真正在内存中运行时的地址肯定不是从0开始的,而且在编写源代码的时候也不能知道程序的绝对地址,所以重定位能够将源代码的代码、变量等定位为内存具体地址。

c/c++编译器安装:

编译器用mingw,

Ps: 你在之前可以把 mingw64 解压或移动到不同于此的位置,但请务必确认这时的地址栏中显示的路径里不包含任何中文或空格!一个中文字都不能有!否则请把 mingw64 文件夹挪到一个纯英文、无空格、最好也比较短的路径中。这件事非常重要!中文路径很容易导致编译器或调试器不能被正确识别或运行

配置环境变量:

一、linux下编译一个 Hello World 实例

使用 GCC 编译一个基本的 C 或者 C++ 程序非常简单。打开你的文本编辑器,并且创建下面的文件:

nano hello.c
#include <stdio.h>
int main()
{
  printf ("Hello World!\n");
  return 0;
}

保存文件,并且将它编译成可执行文件,运行:

gcc hello.c -o hello

这将在你运行命令的同一个目录下创建一个二进制文件,名称为"hello”。

运行这个hell0程序:

./hello

程序应该打印:

Hello World!

二、Ubuntu 下安装多个 GCC 版本

这一节提供一些指令,关于如何在 Ubuntu 20.04 上安装和使用多个版本的 GCC。更新的 GCC 编译器包含一些新函数以及优化改进。

在写作本文的时候,Ubuntu 源仓库包含几个 GCC 版本,从7.x.x10.x.x。在写作的同时,最新的版本是10.1.0

在下面的例子中,我们将会安装最新的三个版本 GCC 和 G++:

输入下面的命令,安装想要的 GCC 和 G++ :

sudo apt install gcc-8 g++-8 gcc-9 g++-9 gcc-10 g++-10

下面的命令配置每一个版本,并且设置了优先级。默认的版本是拥有最高优先级的那个,在我们的场景中是gcc-10

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 --slave /usr/bin/gcov gcov /usr/bin/gcov-10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ g++ /usr/bin/g++-9 --slave /usr/bin/gcov gcov /usr/bin/gcov-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80 --slave /usr/bin/g++ g++ /usr/bin/g++-8 --slave /usr/bin/gcov gcov /usr/bin/gcov-8

以后,如果你想修改默认的版本,使用update-alternatives命令:

sudo update-alternatives --config gcc

输出:

There are 3 choices for the alternative gcc (providing /usr/bin/gcc).
​
  Selection    Path            Priority   Status
------------------------------------------------------------
* 0            /usr/bin/gcc-10   100       auto mode
  1            /usr/bin/gcc-10   100       manual mode
  2            /usr/bin/gcc-8    80        manual mode
  3            /usr/bin/gcc-9    90        manual mode
​
Press <enter> to keep the current choice[*], or type selection number:

你将会被展示一系列已经安装在你的 Ubuntu 系统上的 GCC 版本。输入你想设置为默认的 GCC 版本,并且按回车Enter

这个命令将会创建符号链接到指定版本的 GCC 和 G++。

三、gdb:

要使用GDB(GNU调试器)调试C程序,你需要按照以下步骤进行操作:

  1. 首先,确保你的系统上已经安装了GDB。GDB是GNU Binutils套件的一部分,你可以通过包管理器安装它。例如,在Ubuntu上,你可以使用以下命令安装GDB:

​
sudo apt-get install gdb
  1. 编译你的程序时,使用-g选项启用调试信息。这将告诉编译器在生成的可执行文件中包含额外的调试信息,以便GDB使用。例如,你可以使用以下命令编译你的程序:

​
gcc -g -o myprogram myprogram.c
  1. 运行GDB并加载你的程序。你可以使用以下命令启动GDB并加载你的程序:

​
gdb myprogram
  1. 在GDB中,你可以使用各种命令来设置断点、运行代码、查看变量值等。以下是一些常用的GDB命令:

    • break(或简写为b):设置断点。例如,break main将在main函数处设置断点。

    • run(或简写为r):开始运行程序,直到遇到断点或程序结束。

    • step(或简写为s):逐行执行代码,进入函数调用。

    • next(或简写为n):逐行执行代码,但不进入函数调用。

    • continue(或简写为c):继续执行程序,直到遇到下一个断点或程序结束。

    • print(或简写为p):打印变量的值。例如,print x将显示变量x的值。

  2. 使用上述命令进行调试。你可以设置断点,使用stepnextcontinue命令执行代码,并使用print命令查看变量的值。

  3. 当你完成调试时,可以使用quit命令退出GDB。

makefile make cmake

编写Makefile并执行make

# Makefile
main : main.c
        gcc main.c -o main

通配符:

# Makefile
main : $(wildcard *.c)
        gcc $(wildcard *.c) -o main

变量:

# Makefile
SRCS := $(wildcard *.c)
​
main : $(SRCS)
        gcc $(SRCS) -o main

gcc 命令时通过 -I 选项指定头文件所在路径

# Makefile
INCS := -I./func
SRCS := $(wildcard *.c)
​
main : $(SRCS)
        gcc $(INCS) $(SRCS) -o main