GNU 编译工具 —— gccc++
gcc [选项参数] c文件函数
-o 指定输出文件 工具
gcc -o main ch01.c
二、警告与提示
优化
-pedantic 检测不符合ANSI/ISO C语言标准的源代码,使用扩展语法的地方将产生警告信息。spa
-Wall 生成尽量多的警告信息。调试
-Werror 要求编译器将警告当作错误进行处理。code
-x 指定编译代码类型,c、c++、assembler,none。None根据扩展名自动确认。 对象
gcc –x c -Wall –o main ch01.c
-g 生成调试信息字符串
-O 优化编译器
.a 静态对象库
.c 须要预处理的C语言源代码
.h C语言源代码头文件
.i 不须要预处理的C语言源代码
.o 目标文件
.s 汇编语言代码
.so 共享对象库
一、语法:gcc -E C源代码文件
二、注意:
预处理每次只能处理一个文件。不能处理多个文件,就是每一个.c文件对应一个.i文件。
不指定 –o 选项,预处理的结果输出到标准输出设备。
三、预编译指令
#define 定义宏
#elif else if 多选分支
#else 与#if、#ifndef、#ifdef结合使用
#error 产生错误、挂起与处理程序
#if 断定
#endif 结束断定
#ifdef 断定宏是否认义
#ifndef 断定宏是否认义
#include 将指定的文件插入#include的位置
#include_next 与#include同样,但从当前目录以后的目录查找
#line 指定行号
#pragma 提供额外信息的标准方法,可用来指定平台
#undef 删除宏
#warning 建立一个警告
## 链接操做符号,用于宏内链接两个字符串
编译环境变量:
C_INCLUDE_PATH: 查找头文件的目录——C。
CPATH: 查找头文件,至关于-l选项。
CPLUS_INCLUDE_PATH: 查找头文件的目录——C++。
LD_LIBRARY_PATH: 编译没有影响,主要影响运行。指定目录便于定位共享库。
LIBRARY_PATH: 查找链接文件,至关于-l选项
一、编译成汇编
gcc -S ch01.c ch01_1.c
二、编译汇编
gcc ch01.s ch01_1.s -o main
d.连接
gcc -c -static ch01_1.c
说明:
其中-static可选,可阻止gcc使用共享库,不使用共享库会使可执行文件变大,但会减小运行时间开销
ar -r libmy.a ch01_1.o
gcc -o main ch01.c libmy.a
若是libmy.a在LIBRARY_PATH的指定目录中,还能够采用以下方式编译。
gcc ch01.c -o main –lmy
一、编译成位置独立代码的目标文件,选项-fpic
gcc -c -fpic ch01_1.c
二、编译成共享库,选项-shared
gcc -shared ch01_1.o -o libmy.so
三、使用一条指令
gcc -fpic -shared ch01_1.c -o libmy.so
一、共享库编译的时候与静态库同样依赖LIBRARAY_PATH,运行的时候依赖LD_LIBRARY_PATH。
二、规则:
查找LD_LIBRARY_PATH,目录使用冒号分隔。
/ect/ld.so.cache中找到的列表。工具ldconfig维护。
目录/lib
目录/usr/lib
gcc ch01.c libmy.so -o main
头文件:#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:立刻加载。