gcc的常用选项
-c 只编译汇编不链接,生成目标文件.o
-S 只编译不汇编,生成.s文件
-E 只预处理,生成.i文件
-g 在可执行程序中包含标准调试信息
-o file 将file文件指定为输出文件
-v 打印出编译器内部编译个过程命令行信息和编译器版本
-I dir 在头文件的搜索路径列表添加dir目录
-L dir 在库文件的搜索路径列表中添加dir目录
-static 链接静态库
-library 链接名为library的库文件
-fPIC 生成使用相对地址的位置无关的目标代码(Position Independent Code),通常使用gcc的-static选项从该PIC目标文件生成动态库文件
gcc告警和出错选项
-ansi 支持ANSI标准的c程序
-pedantic 允许发出ANSI C标准所列出的全部警告信息
-Wall 允许发出gcc提供的所有有用的警告信息
在include 语句中,<>表示只在标准路径中搜索头文件,""表示先在本目录中搜索,如果找不到则到标准路径中找
函数的静态库和动态库
静态库 —— 一系列的.o目标文件的归档文件,文件名格式为libname.a;在编译时链接静态库,链接器会搜索静态库,从中提取其所需要的目标文件并直接复制到改程序的可执行二进制文件(ELF格式文件)中。缺点是系统空间被浪费,出错后修改麻烦。
动态库 —— 在程序加载是才被载入,文件名格式为libname.so ,磁盘上只需保留一份副本,节省空间也易于修改。
linux中生成静态库的方式
1、gcc -c lib.c 编译要生成静态库的源文件
2、ar [options] libname.a lib.o 使用ar命令将目标文件归档
3、gcc -o test test.c -L. -lname 编译主程序,链接静态库
linux中生成动态库的方式
gcc -fPIC -Wall -c lib.c 先使用-fPIC选项为动态库构造一个目标文件
gcc -shared -o libname.so lib.o 使用-shared选项和已创建的位置无关目标代码,生成一个动态库libname.so
gcc -o test test.c -L. -lname 编译主程序,链接到动态库
运行可执行程序之前,需要注册动态库的路径名:
1、修改/etc/ld.so.conf文件
2、修改LD_LIBRARY_PATH环境变量
3、将库文件直接复制到/lib或者/usr/lib目录下(这两个目录为系统的默认的库路径名)
gcc的优化选项
通过编译选项 “-On”控制优化代码的生成,其中n代表优化级别
-O 主要进行线程跳转和延迟退栈两种优化
-O2 不进行循环展开和函数内嵌