GCC常用编译选项

时间:2021-06-05 12:39:25

-g  只是编译器,在编译的时候,产生调试信息

-C   在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的   
-M  生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c 来测试一下,很简单。    
-pipe:管道,它可以用来同时连接两个程序,其中一个程序的输出将直接作为另一个程序的输入,这样就可以避免使用临时文件,提高编译速度,但编译时消耗更多的内存.
-Dmacro 定义指定的宏,使它能够通过源码中的#ifdef进行检验(相当于C语言中的#define macro
-g3    获得有关调试程序的详细信息
-v    启动所有报警
-w    禁止所有报警

-Wall    显示所有的Warning

-pg      可以生成gprof调试的文件

-Dmacro=defn 相当于C语言中的#define macro=defn

-Umacro 相当于C语言中的#undef macro

-undef 取消对任何非标准宏的定义

-fno-asm
此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。

-fno-strict-prototype
只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有参数.
而gcc无论是否使用这个参数,都将对没有带参数的函数,认为没有显式说明的类型

-fthis-is-varialble
就是向传统c++看齐,可以使用this当一般变量使用.

-fcond-mismatch
允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型

-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前两个参
数)或者 signed char(后两个参数)

-imacros file
将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中


-D_REENTRANT机制

_REENTRANT宏

在一个多线程程序里,默认情况下,只有一个errno变量供所有的线程共享。在一个线程准备获取刚才的错误代码时,该变量很容易被另一个线程中的函数调用所改变。类似的问题还存在于fputs之类的函数中,这些函数通常用一个单独的全局性区域来缓存输出数据。

为解决这个问题,需要使用可重入的例程。可重入代码可以被多次调用而仍然工作正常。编写的多线程程序,通过定义宏_REENTRANT来告诉编译器我们需要可重入功能,这个宏的定义必须出现于程序中的任何#include语句之前。

_REENTRANT为我们做三件事情,并且做的非常优雅:

(1)它会对部分函数重新定义它们的可安全重入的版本,这些函数名字一般不会发生改变,只是会在函数名后面添加_r字符串,如函数名gethostbyname变成gethostbyname_r。

(2)stdio.h中原来以宏的形式实现的一些函数将变成可安全重入函数。

(3)在error.h中定义的变量error现在将成为一个函数调用,它能够以一种安全的多线程方式来获取真正的errno的值。

-fPIC

In general, you need to compile everything that could be mapped at
arbitrary addresses (in the process's virtual address space) with the
-fPIC option to make it position independent (whatever that means for the
target platform).[一般来说,对于所有地址可能被任意分配的东西,你都需要在用gcc编译
时加上-fPIC选项,以保证编译生成的东西是地址无关的] Programs are loaded at a fixed
address (for i386 Linux,this is somewhere around 0x80000000), so they needn't
be compiled with -fPIC, while shared libraries can be mapped to different addresses
in different processes and thus need -fPIC. [程序会在固定的地址加载运行,所以,他们不需要
地址无关这个特性,因而也不用在编译时加-fPIC选项。但是共享库(动态链接库)不同,他们在运行时加载,
因而地址是很随机的,这时候就需要用-fPIC选项进行编译了]Static libraries are collections of .o files, also called relocatable objects, 
which are not position
independent, but contain the information how to move them to a specified
position ("relocate", which basically means adding the start address to
all pointers). Thus, they don't need -fPIC either.[至于静态库,他们也不是地址无关的,但是他们
包含了进行重定位的信息。所以也不需要-fPIC]

 Linux 如何设置编译选项只链接调用的函数

1、GCC选项添加 COMPILE_FLAGS += -ffunction-sections -fdata-sections 2、LD选项添加 LDFLAGS += -Wl,-gc-sections