Linux C++ 开发2 - 编写、编译、执行第一个程序
上一篇《Linux C++ 开发1 - 搭建C++开发环境》我们搭建好了C++的开发环境,本篇我们将编写、编译、执行第一个程序。
1. 第一个C++程序
1.1. demo01.cpp
这里写一个最简单的HelloWord程序
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
return 0;
}
1.2. 编译和执行
这是最简单的编译和执行方式
# 进入源码目录
cd demo
# 编译: g++ ./demo01.cpp
g++ ./demo01.cpp
# 执行: ./a.out
./a.out
Hello, world!
2. 更多编译选项
2.1. 指定编译的目标文件名
g++ ./demo01.cpp -o ./demo01
# 或
# g++ -o ./demo01 ./demo01.cpp
./demo01
Hello, world!
2.2. 先编译再链接
上面的命令直接把源码编译链接成了可执行文件,真实的编译过程至少经历了:预处理、编译、链接的过程。我们把编译过程拆解成编译、链接两个过程。
# 只编译不链接,生成目标文件:demo01.o
g++ -c ./demo01.cpp
# 将目标文件链接成可执行文件:demo01
g++ -o ./demo01 ./demo01.o
# 执行可执行文件
./demo01
Hello, world!
3. gcc 与 g++
GCC(GNU Compiler Collection
)是一套由GNU项目开发的支持多种编程语言的编译器工具链,里面包含了gcc
和g++
工具。更多C/C++编译器的介绍参见《一文搞懂C/C++常用编译器》。
3.1. gcc编译C++代码
上面的代码是g++
来编译的,其实我们也可以通过gcc
来编译,命令如下:
# 方法一
# 注意:不加-lstdc++的话,链接会报错。
gcc demo01.cpp -lstdc++
./a.out
Hello, world!
# 方法二
gcc -o demo01 demo01.cpp -lstdc++
./demo01
Hello, world!
# 方法三
gcc -c ./demo01.cpp
gcc -o ./demo01 ./demo01.o -lstdc++
./demo01
Hello, world!
可以看到gcc
也可以正确编译C++的代码,区别是需要加-lstdc++
参数。这是因为g++
默认链接了libstdc++
,而gcc
默认不链接,需要手动指定。
3.2. gcc与g++的区别
GUN的gcc和g++都是编译器驱动程序,用于编译和链接源代码。它们的主要区别在于处理C++代码时的行为和默认设置。以下是它们的主要区别:
1. 默认语言标准:
gcc:默认处理C语言代码。
g++:默认处理C++语言代码。
2. 编译器前端:
gcc:使用GCC(GNU Compiler Collection)的C编译器前端。
g++:使用GCC的C++编译器前端。
3. 默认库链接:
gcc:在链接阶段,默认只链接C标准库。
g++:在链接阶段,默认链接C++标准库,同时也会链接C标准库。
4. 处理C++特定语法和特性:
gcc:不支持C++特定的语法和特性。
g++:支持C++特定的语法和特性,如类、模板、命名空间等。
5. .c
源文件的编译:
gcc:把它当作是C程序。
g++:当作是c++程序。
备注: 后缀为.cpp的,两者都会认为是c++程序。
6. 编译选项:
gcc:可以使用-lstdc++选项来链接C++标准库。
g++:不需要额外选项,默认链接C++标准库。
总结来说,gcc主要用于编译C代码,而g++主要用于编译C++代码,并且在链接阶段会自动处理C++标准库的链接。如果你需要编译C++代码,建议使用g++,这样可以避免手动指定链接C++标准库的麻烦。
4. gcc 和 g++ 的常用编译选项
4.1. 常用编译选项
-
基本选项:
-o <file>
:指定输出文件的名称。-c
:只编译不链接,生成目标文件(.o
)。-E
:只进行预处理,不编译、汇编或链接。-S
:只编译不汇编,生成汇编代码文件(.s
)。
-
优化选项:
-O0
:不进行优化(默认)。-O1
:基本优化。-O2
:更多优化,但会增加编译时间。-O3
:最大程度优化,可能会显著增加编译时间。-Os
:优化大小,适用于嵌入式系统。
-
调试选项:
-g
:生成调试信息,用于调试工具(如GDB)。-ggdb
:生成GDB专用的调试信息。
-
警告选项:
-Wall
:启用所有警告。-Wextra
:启用额外的警告。-Werror
:将警告视为错误。
-
语言标准选项:
- gcc编译C语言(
.c
)时使用的C标准:-std=c99
:使用C99标准。-std=c11
:使用C11标准。-std=gnu99
:使用GNU扩展的C99标准。-std=gnu11
:使用GNU扩展的C11标准。
- g++编译C++(
.cpp
)时使用的C标准:-std=c++98
:使用C++98标准。-std=c++03
:使用C++03标准。-std=c++11
:使用C++11标准。-std=c++14
:使用C++14标准。-std=c++17
:使用C++17标准。-std=c++20
:使用C++20标准。
- gcc编译C语言(
-
链接选项:
-l<library>
:链接指定的库。-L<path>
:指定库文件的搜索路径。-static
:静态链接库。
-
预处理器选项:
-D<name>
:定义宏。-D<name>=<value>
:定义带值的宏。-I<path>
:添加头文件搜索路径。
-
链接C++标准库:
-lstdc++
: 链接C++标准库。(gcc编译.cpp时要加上此选项;g++编译可不加,因为默认会链接C++标准库)
-
其他选项:
-v
:显示编译器的版本和配置信息。-save-temps
:保存中间文件(如预处理文件、汇编文件等)。
4.2. 示例
g++ -o myprogram myfile.cpp -std=c++11 -O2 -Wall -g
上面的命令将编译myfile.cpp
文件,生成myprogram
可执行文件,使用C++11标准,优化级别为2,启用所有警告,生成调试信息。
大家好,我是陌尘。
IT从业10年+, 北漂过也深漂过,目前暂定居于杭州,未来不知还会飘向何方。
搞了8年C++,也干过2年前端;用Python写过书,也玩过一点PHP,未来还会折腾更多东西,不死不休。
感谢大家的关注,欢迎加我微信(Spencer_MC),期待与大家一起交流。