-E 预处理指定源文件
-S 编译指定源文件
-c 汇编指定源文件
-o 生成可执行文件
-I directory 指定Include包含文件的搜索目录
-g 编译的时候生成调试信息
-D 在程序编译时指定一个宏
-w 不生成任何的警告信息
-Wall 生成所有警告
-On n:0~3;表示编译器的优化选项级别 O0 - 不优化;O1 - 缺省值;O3 - 优化级别最高
-l 编译时指定库
-L 编译时指定库的路径
-fpic 生成与位置无关的代码
-shared 生成共享目标文件
-std 指定方言 -std=c++11
gcc编译.c;g++编译.cpp即可
在编译阶段g++会自动调用gcc 二者等价
静态库的制作
库的好处:代码保密;方便部署和分发;
静态库:在程序的链接阶段被复制到程序中
命名规则:linux-libxxx.a;windows-libxxx.lib;lib为前缀,xxx为库名
制作步骤:
1. gcc获得.o文件
2. .o文件用ar工具打包 ar rcs libxxx.a xxx.o xxx.o
静态库的使用
gcc main.c -o app -I ./include/ -l calc -L ./lib;-I 提供头文件目录,-L 指定库的路径,-l 库的名称
动态库的制作与使用
动态库:在链接阶段没有复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用
命名规则:linux - libxxx.so;windows - libxxx.dll;
制作流程:
1. gcc得到.o文件,生成和位置无关的代码(-fpic)
2. gcc得到动态库(-shared)
动态库加载失败的原因:程序启动时,动态库被动态加载到内存中(使用到动态库中的API时才会加载)。需要ldd检查动态库依赖关系
需要系统的动态载入器(ld-linux.so)来获取所依赖库的绝对路径,先检查虚拟地址空间、LD_LIBRARY_PATH、/etc/ld.so.cache、/lib/(/user/lib)将动态库加载到内存中;
解决办法:在动态载入器查找范围内,加入动态库即可。
eg. 配置环境变量(LD_LIBRARY_PATH)
但配置的环境变量是临时了,新开中断没有。永久配置环境变量的方法:1. 用户级别;2. 系统级别
用户级别的配置:在.bashrc中添加上述环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/linux/lesson06/library/lib
. .bashrc更新即可;
系统级别的配置:sudo vim/etc/profile
eg. 配置文件列表
通过添加库绝对路径在/etc/ld/so/conf;sudo ldconfig更新即可
eg. 将动态库文件放置在/lib/(/user/lib)下(不建议,可能会替换系统本身的文件)
静态库的优缺点
+ 静态库被打包到应用程序中加载速度快
+ 发布程序无需提供静态库,移植方便
- 消耗系统资源、更新内存
- 更新、部署、发布麻烦
动态库的优缺点
+ 进程间资源共享(共享库)
+ 更新、部署、发布简单
+ 可控制加载动态库的时间
- 加载速度慢
- 发布程序需要提供依赖的动态库