g++编译

GCC与G++的编译包括预处理、汇编、编译和链接四个步骤。预处理生成.i文件,编译产生.s文件,汇编得到.o目标文件,最后链接生成可执行程序。编译时常用参数如-g用于添加调试信息,-O[n]进行代码优化,-l和-L用于链接库,-I指定头文件路径。

总体过程


gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步:

  1. 预处理,生成 .i 的文件[预处理器cpp]
g++ -i xxx.cpp      //  xxx.i
  1. 将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]
g++ -s xxx.i      // xxx.s
  1. 有汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as]
g++ -c xxx.s      //  xx.o
  1. 连接目标代码, 生成可执行程序 [链接器ld]
g++ -o xxx xxx.cpp    //xxx.exe

其他编译参数

调试

  1. -g 编译带调试信息的可执行文件
  2. -O[n] 优化源代码(O大写)
  3. -l和 -L 指定库文件 | 指定库文件路径
# -l参数(小写)就是用来指定程序要链接的库,-l参数紧接着就是库名
# 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接

# 举例-l链接glog库 
g++ -lglog test.cpp


# 如果库文件没放在上面三个目录里(及不在lib),需要使用-L参数(大写)指定库文件所在目录
# -L参数跟着的是库文件所在的目录名

# 举例-L链接mytest库,libmytest.so在/home/bing/mytestlibfolder目录下
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp
  1. -I (大写i) 指定头文件搜索目录
# -I 
# /usr/include目录一般是不用指定的,gcc知道去那里找,但 是如果头文件不在/usr/icnclude
里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-
I/myinclude 参数了,如果不加你会得到一个”xxxx.h: No such file or directory”的错
误。-I参数可以用相对路径,比如头文件在当前 目录,可以用 -I. 来指定。上面我们提到的–cflags参
数就是用来生成-I参数的。

g++ -I/myinclude test.cpp 
  1. -Wall 打印警告信息
  2. -w 关闭警告信息
  3. -std=c++11 设置编译标准
  4. -o 指定输出文件名
  5. -D 定义宏
### g++ 编译 C++ 程序的使用方法 #### 基本命令结构 `g++` 的基本命令结构如下所示: ```bash g++ [选项] 输入文件 -o 输出文件 [其他选项] ``` 其中,输入文件可以是一个或多个 `.cpp` 文件或其他支持的语言源码文件。 --- #### 单文件编译 对于单个 C++文件(如 `main.cpp`),可以直接将其编译并生成可执行文件。例如: ```bash g++ main.cpp -o main_program ``` 上述命令会将 `main.cpp` 编译成名为 `main_program` 的可执行文件[^2]。 --- #### 多文件编译 当项目涉及多个源文件时,可以通过一次调用 `g++` 将它们一起编译和链接。例如: ```bash g++ Student.cpp main.cpp -o program_name -std=c++11 ``` 此命令将 `Student.cpp` 和 `main.cpp` 同时编译,并指定标准为 C++11[^1]。 如果需要分别编译再链接,则需先单独编译各个源文件目标文件(`.o` 文件)。例如: ```bash g++ -c Student.cpp -o Student.o g++ -c main.cpp -o main.o ``` 之后通过以下命令完成链接操作: ```bash g++ Student.o main.o -o final_program ``` 这种方式特别适合大型项目的模块化管理[^3]。 --- #### 设置编译标准 为了兼容不同的 C++ 版本,可通过 `-std` 参数设置目标标准。常见的标准有: - `-std=c++98`: 支持旧版 C++ 标准。 - `-std=c++11`: 添加了 lambda 表达式、智能指针等功能。 - `-std=c++17`: 提供更多现代化特性,如 structured bindings 和 parallel algorithms。 - `-std=c++20`: 引入协程、概念(concepts)、范围(ranges)等新特性。 例如,在 Linux 下启用 C++11 标准时: ```bash g++ source_file.cpp -o output_file -std=c++11 ``` --- #### 链接外部库 某些情况下可能需要用到第三方库,比如多线程编程中的 POSIX 线程库 (`pthread`)。此时应添加 `-lpthread` 选项来链接 pthread 库。例如: ```bash g++ thread_example.cpp -o threads -lpthread ``` 这表示将 `thread_example.cpp` 编译并与 pthread 库连接。 --- #### 调试与优化选项 - **调试模式**: 使用 `-g` 开启调试信息以便于后续分析错误日志。 ```bash g++ debug_code.cpp -o debug_output -g ``` - **代码优化**: 可以通过 `-O` 或其变体控制优化级别。常用的是 `-O2`,它会在性能和编译时间之间取得平衡。 ```bash g++ optimize_code.cpp -o optimized_program -O2 ``` --- #### 自动化构建脚本 在实际开发过程中,通常会编写 Shell 脚本来简化重复性的编译工作。下面展示了一个简单的例子: 创建一个名为 `compile.sh` 的脚本文件: ```bash #!/bin/bash g++ -c main.cpp -o main.o g++ -c functions.cpp -o functions.o g++ main.o functions.o -o final_executable ``` 赋予脚本权限后运行即可自动完成整个过程: ```bash chmod +x compile.sh ./compile.sh ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值