开篇一张图。
编译器 把我们的代码翻译成机器语言
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.x
到10.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程序,你需要按照以下步骤进行操作:
-
首先,确保你的系统上已经安装了GDB。GDB是GNU Binutils套件的一部分,你可以通过包管理器安装它。例如,在Ubuntu上,你可以使用以下命令安装GDB:
sudo apt-get install gdb
-
编译你的程序时,使用
-g
选项启用调试信息。这将告诉编译器在生成的可执行文件中包含额外的调试信息,以便GDB使用。例如,你可以使用以下命令编译你的程序:
gcc -g -o myprogram myprogram.c
-
运行GDB并加载你的程序。你可以使用以下命令启动GDB并加载你的程序:
gdb myprogram
-
在GDB中,你可以使用各种命令来设置断点、运行代码、查看变量值等。以下是一些常用的GDB命令:
-
break
(或简写为b
):设置断点。例如,break main
将在main
函数处设置断点。 -
run
(或简写为r
):开始运行程序,直到遇到断点或程序结束。 -
step
(或简写为s
):逐行执行代码,进入函数调用。 -
next
(或简写为n
):逐行执行代码,但不进入函数调用。 -
continue
(或简写为c
):继续执行程序,直到遇到下一个断点或程序结束。 -
print
(或简写为p
):打印变量的值。例如,print x
将显示变量x
的值。
-
-
使用上述命令进行调试。你可以设置断点,使用
step
、next
和continue
命令执行代码,并使用print
命令查看变量的值。 -
当你完成调试时,可以使用
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