GCC编译中的可选参数

1.-l和-L参数
-l是指动态库已经包含在/usr/lib目录地下,其使用方法是-l后面紧跟库名,这个库名是去除了lib前缀和.so后缀,比如数学库名字为libm.so,就应该使用-lm
-L如果需要调用的库路径不在/usr/lib目录下,这个时候就需要指定库所在路径,比如-L/mnt/madplay/lib

2.-include和-I
-include一般文件需要包含的头文件都在文件头通过“#include xxx”包含,所以-include很少用到
-I指定头文件所在目录,比如-I/mnt/madplay/include

3.-static
静态编译,默认选项

4.-fPIC -shared
-fPIC是编译位置无关码,如果静态库需要被动态库连接(这个时候,相当于把静态库的内容复制到动态库内部),则编译静态库也需要加.a
-shared是动态编译成.so

5.生成Map文件,方便评估资源空间
-Wl,-Map=$(BINDIR)/app.map

6.编译选项-fdata-sections -ffunction-sections
分别将data和函数分段存储

7.-Wl,–gc-sections
自动将没有被调用的段去除,减少目标文件大小

8.-g2为默认调试版本,等于-g,没有这个参数,则生成的是release版本程序
不包含gdb调试信息

9.-Wl,–strip-all
删除符号表,则gdb调试中的所有标号都会被删除

10.-mfloat-abi
在编译带有浮点参数的函数时,有三种可能的编译选项:-mfloat-abi=soft/softfp/hard。
“soft”选项:表明不使用FPU硬件,而是使用GCC的整数算术运算来模拟浮点运算。
“softfp”选项:表明要使用FPU硬件来做浮点运算,只是,函数的参数传递到整数寄存器(r0-r3)中,然后再传递到FPU中。
“hard”选项:表明要使用FPU硬件来做浮点运算,并且,函数的参数直接传递到FPU的寄存器(s0、d0)中。

11.-Wl,-wrap,xxx
优先链接名为__wrap_xxx的函数,以替换xxx函数。
常用于替换标准库中的函数实现,如替换libc中的malloc和free,可以定义
void *__wrap_malloc (size_t size)和void __wrap_free(void *ptr)

12.ar生成库文件
ar -c 创建静态库文件
ar -r 将objfile文件插入静态库尾或者替换静态库中同名文件
ar -s 重置静态库文件索引
ar -rcs lib.a a.o b.o c.o
上面的命令将a.o b.o c.o三个目标文件链接成静态库文件lib.a,
ar -t 查询静态库的目标文件

13.内存对齐

#pragma pack(n)
#pragma pack()

#pragma pack(n)告诉编译器结构体或类内部的成员变量相对于第一个变量的地址的偏移量的对齐方式,缺省情况下,编译器按照自然边界对齐,当变量所需的自然对齐边界比n大 时,按照n对齐,否则按照自然边界对齐;

struct st{
	int a;
	short b;
}__attribute__((align(m)));

__attribute__((aligned(m)))告诉编译器一个结构体或者类或者联合或者一个类型的变量(对象)分配地址空间时的地址对齐方式。也就是说,如 果将__attribute__((aligned(m)))作用于一个类型,那么该类型的变量在分配地址空间时,其存放的地址一定按照m字节对齐(m必 须是2的幂次方)。并且其占用的空间,即大小,也是m的整数倍,以保证在申请连续存储空间的时候,每一个元素的地址也是按照m字节对齐。 __attribute__((aligned(m)))也可以作用于一个单独的变量

### 回答1: 当你在Linux上使用gcc编译器时,通常需要执行以下步骤: 1. 打开终端窗口并进入要编译的源代码目录。 2. 编写一个Makefile文件,它描述了源文件之间的依赖关系以及如何编译它们。这是可选的,但对于大型项目来说,它可以使编译过程更加自动化和可靠。 3. 输入以下命令来编译源代码: `gcc -o <输出文件名> <源文件1> <源文件2> ...` 这将使用gcc编译器将所有源文件编译成一个可执行文件,并将其保存在指定的输出文件名。例如: `gcc -o myprogram main.c file1.c file2.c` 4. 如果编译过程出现错误,gcc将会给出相应的错误信息,你需要检查错误并修复它们,然后重新编译。 这是一个基本的编译过程。当然,gcc还有许多选项和参数可供使用,可以根据需要进行调整和定制。 ### 回答2: GCC是GNU编译器集合的缩写。本质上,它是一个用于编译和链接C和C++代码的编译器。GCC是开源的,可移植的,以及非常流行的编译器。由于其开源的本质,GCC在许多不同的操作系统上是通用的,包括Linux。 在Linux系统GCC是默认的编译器。它被包含在大多数Linux分发版,并且它有一个Linux专用版本,称为Linux GCCGCC可以用于编译许多不同类型的代码,包括应用程序,库和驱动程序。当然,GCC最重要的特点之一是其灵活性,它可以输入许多不同的源代码文件格式,包括C,C++,Fortran,和Ada等。 GCC的安装通常随着Linux系统的安装而自动安装。如果您的Linux系统上没有安装GCC,您可以通过在终端使用包管理器命令安装它。命令可能是: sudo apt-get install gcc GCC编译过程首先会预处理源代码(将源文件的预处理指令进行展开),接着是编译阶段,将源代码转换为汇编代码,然后将汇编代码转换为二进制机器代码,最后是链接阶段,将不同的模块组合在一起形成可执行文件或动态库。 GCC编译器支持大量的编译选项和参数,使其更加灵活。其一些选项是可用于微调编译器优化,减少代码大小等。GCC也提供了许多调试选项,以便在处理编译错误和调试代码时使用。 总之,作为一个开源,跨平台的编译器,GCC在Linux系统具有不可替代的地位。它是许多开发人员的首选,因为它能够在Linux系统上编译和构建各种类型的应用程序和库。 ### 回答3: GCC是GNU Compiler Collection的简称,是一个跨平台的编译器集合,被广泛地使用在Linux操作系统下的应用程序开发。 在Linux下进行程序开发,需要进行编译过程,将源代码转换成可执行文件。GCC提供了一个强大的编译器和链接器,可编译多种语言的源代码,例如C、C++、Objective-C、Fortran等,支持多种编译选项,能够满足不同开发者的需求。 在使用GCC进行编译时,首先需要安装GCC编译器。在Linux系统,安装GCC非常简单,可以执行以下命令: sudo apt-get update sudo apt-get install gcc 上述命令会从Linux软件仓库下载并安装GCC编译器。安装完成后,就可以开始进行编译了。 使用GCC编译一个C程序时,可以将源代码保存为.c文件,然后在终端执行以下命令: gcc -o hello hello.c 其,-o选项用于指定输出文件的名称,hello.c为源文件的名称。如果编译成功,会生成一个名为hello的可执行文件。 除了基本的编译命令外,GCC还提供了许多编译选项,可以用来控制编译过程,例如优化级别、警告选项等。开发者可以根据自己的需求选择合适的编译选项,以优化程序的性能和可靠性。 总之,GCC是一款功能强大的编译器,提供了丰富的编译选项,为Linux操作系统下的应用程序开发提供了良好的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值