gcc

1. GCC常用参数

gcc编译选项 选项的意义
-E 预处理指定的源文件,不进行编译
-S 编译指定的源文件,但是不进行汇编
-c 编译、汇编指定的源文件,但是不进行链接
-o [file1] [file2] / [file2] -o [file1] 将文件 file2 编译成文件 file1
-I directory (大写的i) 指定 include 包含文件的搜索目录
-g 在编译的时候,生成调试信息,该程序可以被调试器调试
-D 在程序编译的时候,指定一个宏
-w 不生成任何警告信息, 不建议使用, 有些时候警告就是错误
-Wall 生成所有警告信息
-On n的取值范围:0~3。编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-l 在程序编译的时候,指定使用的库
-L 指定编译的时候,搜索的库的路径。
-fPIC/fpic 生成与位置无关的代码
-shared 生成共享目标文件。通常用在建立共享库时
-std 指定C方言,如:-std=c99,gcc默认的方言是GNU C

2. 使用预处理器宏来控制代码的不同执行路径

通过在编译时定义宏,可以启用或禁用特定的代码块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

int main() {
#ifdef FEATURE_A
std::cout << "Feature A is enabled." << std::endl;
#else
std::cout << "Feature A is not enabled." << std::endl;
#endif

#ifdef FEATURE_B
std::cout << "Feature B is enabled." << std::endl;
#else
std::cout << "Feature B is not enabled." << std::endl;
#endif

return 0;
}

image-20240612134413327

  • -D<MACRO> 是编译指令,用于定义宏。在这个例子中,-DFEATURE_A 定义了宏 FEATURE_A,使得与该宏相关的代码块被包含进来进行编译。
  • #ifdef#else 是预处理器指令,用于检查宏是否被定义。#ifdef FEATURE_A 表示当 FEATURE_A 被定义时,包含其后的代码块。#else 则表示如果 FEATURE_A 未被定义时包含其后的代码块。
  • #endif 用于结束条件编译语句。

通过这种方式,你可以在编译时灵活地控制哪些代码被编译和执行,适应不同的编译需求或配置环境。