-c
-c指定源文件。

-fPIC
动态库基本原理和使用方法,-fPIC选项的来龙去脉

-fPIC表示编译为位置无关代码,用于动态链接重定位。使用gcc生成so文件时,一般要加一个 -fPIC 选项。
使用 -fPIC 选项,会生成 PIC 代码。.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接。动态链接执行很复杂,比静态链接执行时间长;但是,极大的节省了 size。

# 使用g++产生地址无关代码
g++ --shared -fPIC -o add.so add.cc

# 查看是否使用PIC
# 如果不是PIC,则不会有任何输出
readelf -d libbook.so | grep TEXTREL


-g
-g表示加入调试信息,可用dgb调试。

-o
-o指定输出名称。

-std
-std指定c++标准。

-w相关

通过 -W 开头,能指定开启许多警告,与之对应通过 -Wno- 也能关闭指定的警告。

-w
-w,禁用所有警告。

-Werror
-Werror,所有警告变成error。

-Werror=xxx
-Werror=xxx,指定的警告变成error。例如:-Werror=switch,表示 -Wswitch控制的警告变成error。

-Wno-error=xxx
-Wno-error=xxx,指定的警告不变成error,即使 -Werror 被指定。例如:-Wno-error=switch,表示 -Wswitch控制的警告不变成error。

-Wxxx
-Wxxx,打开指定的警告。例如:-Wimplicit。

-Wno-xxx
-Wno-xxx,关闭特定的警告。例如:-Wno-implicit。

-Wall
-Wall 开启一组常见的警告,包括但不限于未使用变量、函数未声明等。它允许编译器发现一些潜在的代码问题,但并不包括所有可能的警告。

-Wextra

-Wextra 打开更多的警告,包括一些 -Wall 没有涵盖到的。这可能包括一些更严格的规则,帮助进一步提高代码质量。

-Wextra 列出没被 -Wall 列出的警告:

-Wfatal-errors
-Wfatal-errors,使得编译器在遇到第一个error后就终止编译。

-Wl
-Wl用于告诉编译器后续的参数传给连接器,链接器的参数用","逗号隔开,不允许有空格。

-pedantic
-pedantic,列出违背严格的c/c++标准的所有警告。

-pedantic-errors
-pedantic-errors,列出违背严格的c/c++标准的所有错误。

其他编译选项
-Wnon-virtual-dtor,当类用于多态时,即基类被继承时,析构函数非虚时会发出警告。
-Wold-style-cast,当使用c语言式的类型转换将发出警告。
-Woverloaded-virtual,当子类重载了基类虚函数时,会发出警告,因为此时基类定义的虚函数被子类隐藏了。
-Wswitch-default,当switch语句没有default分支时,发出警告。
-Wshadow,当一个变量掩盖了另一个变量时给出警告。
-Wcast-qual,当类型转换丢失限定信息时给出警告。
-Wextra-semi,当类函数定义后出现多余的分号给出警告。