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)))
也可以作用于一个单独的变量