Linux下C/C++编程开发GCC
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下C/C++编程开发GCC相关的知识,希望对你有一定的参考价值。
文章目录
前言
下面的所有操作的的操作都是基于:
- 操作系统:
Ubuntu20.04.3-desktop
- GCC-Version:
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
- G+±Version:
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
一、GCC
GCC
原名为GNU C
语言编译器(GNU C Compiler
)是由 GNU 开发的编程语言译器。GNU 编译器套件包括C
、C++
、Objective-C
、Java
、Ada
和Go
语言前端,也包括了这些语言的库(如libstdc++
,libgcj
等)
二、 安装GCC、G++
在终端中输入sudo apt install gcc g++
即可完成安装,然后通过gcc --version
和 g++ --version
就可以查看当前安装的版本,如下:
mangata@mangata:~$ g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
mangata@mangata:~$ gcc --version
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
三、GCC的工作流程
我们在编译代码的时候的流程基本就是上面的步骤:预编译->编译->汇编->链接
假设我们有一个代码test.c
:
#include <stdio.h>
#define MAX_SIZE 5
int main()
int res = MAX_SIZE;
int len = MAX_SIZE;
for(int i = 0;i < len; ++i)
printf("Hello world %d\\n",i);
return 0;
3.1 预编译
在终端中输入:
gcc -E test.c -o test.i
然后就会生成一个test.i
文件,这个其实就是预编译处理后的源代码
我们可以看到main
函数中的MAX_SIZE
已经被替换了
3.2 编译
在终端输入:
gcc -S test.i -o test.s
此时就会生成一个 test.s
的汇编代码
3.3 编译
在终端输入:
gcc -c test.s -o test.o
此时就会生成一个 test.o
的二进制代码
3.4 链接
在终端输入:
gcc -o test test.o
此时就会生成一个 test
的可执行程序,此时我们就可以通过./test
运行我们的程序了~
3.5 一步到位
当然我们也可以一步到位,直接从 .c
文件生成 可执行文件:
gcc -o test test.c
四、GCC、G++常用编译选项
gcc编译选项 | 说明 |
---|---|
-E | 预处理指定的源文件,不进行编译 |
-S | 编译指定的源文件,但是不进行汇编 |
-c | 编译、汇编指定的源文件,但是不进行链接 |
-o [file1] [file2] 或者 [file2] -o [file1] | 将文件 file2 编译成可执行文件 file1 |
-I | directory 指定 include 包含文件的搜索目录 |
-g | 在编译的时候,生成调试信息,该程序可以被调试器调试 |
-D | 在程序编译的时候,指定一个宏 |
-w | 不生成任何警告信息 |
-Wall | 生成所有警告信息 |
-On |
n
n
n 的取值范围:
[
0
,
3
]
[0,3]
[0,3] 编译器的优化选项的
4
4
4 个级别,-O0 表示没有优化,-O1 为缺省值,-O3 优化级别最高 |
-l | 在程序编译的时候,指定使用的库 |
-L | 指定编译的时候,搜索的库的路径。 |
-fPIC/fpic | 生成与位置无关的代码 |
-shared | 生成共享目标文件,通常用在建立共享库时 |
-std | 指定C方言,如:-std=c99 ,gcc 默认的方言是GNU C |
五、GCC和G++区别
-
编译阶段,
g++
会调用gcc
,对于C++
代码,两者是等价的,但是 因为gcc
命令不能自动和C++
程序使用的库联接,所以通常用g++
来完成链接,为了统一起见,干脆编译/链接统统用g++
了 ,这就给人一种错觉,好像c++
程序只能用g++
似的,所以对于不需要链接的C++
程序而言我们仍然可以使用gcc
编译 -
如果源代码文件后缀为
.c
,并且采用gcc
编译器那么__cplusplus
宏是未定义的,否则是定义的
例如我们有如下代码 a.cc
:
#include <stdio.h>
int main()
#ifdef __cplusplus
printf("__cplusplus is define!\\n");
#endif
return 0;
然后编译生成可执行文件a
: gcc -o a a.cc
我们执行这个程序的时候会发现,终端输出了__cplusplus is define!
也表示__cplusplus
宏是定义的,即便是用gcc
编译
- 编译可以用
gcc/g++
,而链接可以用g++或者gcc -lstdc++
gcc
命令不能自动和C++
程序使用的库联接.所以通常使用g++
来完成联接。但在编译阶段,gcc
会自动调用g++
,二者等价
以上是关于Linux下C/C++编程开发GCC的主要内容,如果未能解决你的问题,请参考以下文章