GNU 编译工具——gcc
GNU 编译工具 —— gcc
一、语法
gcc [选项参数] c文件
二、选项参数
1、指定输出文件名
-o 指定输出文件
gcc -o main ch01.c
2、警告与提示
-pedantic 检测不符合ANSI/ISO C语言标准的源代码,使用扩展语法的地方将产生警告信息。
-Wall 生成尽可能多的警告信息。
-Werror 要求编译器将警告当做错误进行处理。
3、指定编译文件类型
-x 指定编译代码类型,c、c++、assembler,none。None根据扩展名自动确认。
gcc –x c -Wall –o main ch01.c
4、生成调试信息与优化
-g 生成调试信息
-O 优化
5、建议:在编译任何程序的时候都带上-Wall选项
三、文件后缀名
.a 静态对象库
.c 需要预处理的C语言源代码
.h C语言源代码头文件
.i 不需要预处理的C语言源代码
.o 目标文件
.s 汇编语言代码
.so 共享对象库
四、编译过程
a.预处理。
1、语法:gcc -E C源代码文件
2、注意:
预处理每次只能处理一个文件。不能处理多个文件,就是每个.c文件对应一个.i文件。
不指定 –o 选项,预处理的结果输出到标准输出设备。
3、预编译指令
#define 定义宏
#elif else if 多选分支
#else 与#if、#ifndef、#ifdef结合使用
#error 产生错误、挂起与处理程序
#if 判定
#endif 结束判定
#ifdef 判定宏是否定义
#ifndef 判定宏是否定义
#include 将指定的文件插入#include的位置
#include_next 与#include一样,但从当前目录之后的目录查找
#line 指定行号
#pragma 提供额外信息的标准方法,可用来指定平台
#undef 删除宏
#warning 创建一个警告
## 连接操作符号,用于宏内连接两个字符串
b.编译
编译环境变量:
C_INCLUDE_PATH: 查找头文件的目录——C。
CPATH: 查找头文件,相当于-l选项。
CPLUS_INCLUDE_PATH: 查找头文件的目录——C++。
LD_LIBRARY_PATH: 编译没有影响,主要影响运行。指定目录便于定位共享库。
LIBRARY_PATH: 查找连接文件,相当于-l选项
c.汇编
1、编译成汇编
gcc -S ch01.c ch01_1.c
2、编译汇编
gcc ch01.s ch01_1.s -o main
d.链接
五、创建静态库
A、创建静态库
a、编译静态库
gcc -c -static ch01_1.c
说明:
其中-static可选,可阻止gcc使用共享库,不使用共享库会使可执行文件变大,但会减少运行时间开销
b、生成静态库
ar -r libmy.a ch01_1.o
c、使用静态库
gcc -o main ch01.c libmy.a
如果libmy.a在LIBRARY_PATH的指定目录中,还可以采用如下方式编译。
gcc ch01.c -o main –lmy
B、创建共享库
a、编译共享库
1、编译成位置独立代码的目标文件,选项-fpic
gcc -c -fpic ch01_1.c
2、编译成共享库,选项-shared
gcc -shared ch01_1.o -o libmy.so
3、使用一条指令
gcc -fpic -shared ch01_1.c -o libmy.so
b、定位共享库
1、共享库编译的时候与静态库一样依赖LIBRARAY_PATH,运行的时候依赖LD_LIBRARY_PATH。
2、规则:
查找LD_LIBRARY_PATH,目录使用冒号分隔。
/ect/ld.so.cache中找到的列表。工具ldconfig维护。
目录/lib
目录/usr/lib
c、使用共享库
gcc ch01.c libmy.so -o main
d、共享库的四个函数
头文件:#include <dlfcn.h>
void *dlopen(const char *filename, int flag);
char *dlerror(void);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
其中dlopen的参数flag的含义如下:
RTLD_LAZY:符号查找时候才加载。
RTLD_NOW:马上加载。
转载于:https://my.oschina.net/u/1169027/blog/186402
上一篇: @RequestParam是啥?
下一篇: GNU gcc的编译工具用法(转)