静态库和动态库
静态库:
1. 编译时链接;
2.浪费空间和资源,如果多个程序链接了同一个库,则每个生成的可执行文件就都会有一个库的副本,必然浪费系统的空间;
3.若静态库修改了,需要重新进行编译所有链接的程序
动态库:
1. 运行时链接
2. 运行时被链接,程序运行速度稍慢
3.动态库在程序运行时被链接,所以磁盘上只需要保留一份副本,因此节约磁盘空间。如果发现bug或者升级也很简单,只需要用新的库把原来的替换掉。
GCC编译流程:
1.预处理:C/C++源文件中,#开头的命令都是预处理命令,包括头文件,宏定义以及条件编译等。预处理就是将头文件插入到源文件中,把宏定义展开,根据条件编译选择使用代码,最后这些代码输出到.i文件等待下一步处理。
gcc -E hello.c -o hello.i
2.编译:将C/C++代码编译成汇编代码
gcc -S hello.i -o hello.s
3.汇编:将编译等到的文件翻译成一定格式的机器代码
gcc -c hello.s -o hello.o
4.链接:将上步生成的OBJ文件和系统的OBJ文件,库文件链接起来,生成可执行文件。
gcc hello.o
静态链接是在GCC编译中链接时一起打包到可执行文件;而动态库在程序编译时并不会链接导目标代码中,而是在程序运行时才载入。不同的应用程序如果调用相同的库,那么在内存中只需要有一份该共享库的实例,规避了浪费空间的问题。动态库是在程序运行时才载入,也解决了静态库对程序的更新,部署和发布带来的麻烦。用户只需要更新动态库即可。
生成静态库:
ar crv libfoo.a foo.c other.c
加载静态库:
g++ -o main main.cpp -L. -lfoo -static
生成动态库:
g++ -o libshare.so -fPIC -shared share1.cpp share2.cpp
加载动态库:
g++ -o main mian.cpp -L. -lshare
通过g++来指定路径:
g++ -o main main.cpp -Wl,-rpath=./ -L. -lshare
-Wl,-rpath是用来指定动态库的路径
此外,动态库指定路径有以下几种方法:
1. export更改LD_LIBRARY_PATH当前终端的环境变量
2.
原文地址:https://www.cnblogs.com/BaymaxHH/p/15209698.html
- Code forces 719A Vitya in the Countryside
- Hadoop数据分析平台实战——190Highcharts介绍离线数据分析平台实战——190Highcharts介绍
- HUST 1555 A Math Homework
- HUST 1541 Student’s question
- HDU 3785 寻找大富翁
- Hadoop数据分析平台实战——250JSSDK数据收集引擎编写离线数据分析平台实战——250JSSDK数据收集引擎编写
- HDU 2564 词组缩写
- 约瑟夫问题方法总结
- 欧里几德及扩展欧里几德算法
- Hadoop数据分析平台实战——260用户数据ETL离线数据分析平台实战——260用户数据ETL
- # Hadoop离线数据分析平台实战——230项目数据存储结构设计Hadoop离线数据分析平台实战——230项目数据存储结构设计
- ECJTUACM16 Winter vacation training #5 题解&源码
- Codeforces 716A Crazy Computer
- Hadoop数据分析平台实战——240JavaSDK数据收集引擎编写离线数据分析平台实战——240JavaSDK数据收集引擎编写
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PyCharm2019亲测破解方式
- :: 是什么语法?
- 支付宝二面:Mybatis接口Mapper内的方法为啥不能重载吗?我直接懵逼了...
- Windows系统中使用Linux命令(可以批量下载Modis数据)
- Python制作桑基图(我承认我低估了这个教程)
- 几个好看的Seaborn图样~(虽然官方配色一般般,但我还是忍不住夸它)
- GDAL读取MAIAC的HDF文件(熟肉)
- Google Earth Engine(GEE)-谷歌地球引擎的大致Python入门
- 谷歌地球引擎(Google Earth Engine)之数据初探(栅格和矢量)
- Python-gdal离线文档下载
- 利用python把shp文件写入PostgresSQL数据库
- python调用cmd运行GDAL报错解决:ERROR 1: PROJ
- Tungsten Fabric知识库丨测试2000个vRouter节点部署
- 一行代码快速图像识别~一排代码搞定视频识别
- Python测试开发django5.urls.py参数name与<a>标签的引用