在日常开发中,其实大部分时间我们都会和第三方库或系统库打交道。在 Android 开发音视频开发领域,一般会用到 FFmepg、OpenCV、OpenGL 等等开源库, 我们一般都会编译成动态库共我们程序使用。对于类 unix 系统,静态库为 .a, 动态库为 .so。而 windows 系统静态库为 .lib, 动态库为.dll。
静态链接库
回顾程序编译的四个步骤:
预编译 -> 编译 -> 汇编 -> 链接 
静态库和动态库就是在链接阶段行为不同,静态库会在链接阶段将汇编生成的目标文件 .o 与引用的库一起链接打包到可执行文件中。静态库其实就是一系列目标文件的集合,可以用 ar 工具打包生成。静态库特点有:

  • 静态库对函数的链接在编译时期完成
  • 程序在运行时与函数库再无关系
  • 浪费资源空间,因为所有相关的目标文件都会被链接到一个可执行文件中
 我们来看一个例子:
// 头文件 Math.hpp
#ifndef Math_hpp
#define Math_hpp
#include <stdio.h>
extern int add(int a, int b);
#endif /* Math_hpp */ // Math.hpp 实现文件
#include "Math.hpp" int add(int a, int b)
{
return a + b;
} // main.cpp main 函数入口
#include <iostream> extern int add(int a, int b); int main(int argc, const char * argv[]) {
// insert code here... using std::cout;
using std::endl; cout << "add 2 3: " << add(2, 3) << endl; return 0;
}

  

  • -t: 按顺序显示归档中的文件名
  • -d: 从归档中删除指定文件

链接静态库
clang++ main.cpp -L. -lmath -o main 
生成成功后,执行 ./main 执行

解释下参数:

  • -L: 表示要链接的库所在目录,如果不指定就会在系统 usr/lib 或 usr/local/lib 下查找
  • -l: 指定链接时的动态库或静态库,如果有动态将会优先被链接

动态链接库
使用动态库的原因,正式因为静态库很耗费内存空间,并且静态库更新简直是灾难,如果库源码发生变动,那么静态库将不得不重新生成。
动态库特点如下:

  • 延迟加载一些库函数,既用到才加载
  • 动态库可以同时被多个程序共享,节省内存

借着上面的例子,显示动态库的使用,首先,生成动态链接库文件
clang++ Math.o -shared -fPIC -Wall -o libmath.so 
生成动态链接库文件后,再使用如下命令生成可执行文件
clang++ main.cpp -L. -lmath -o main 
执行 ./main
参数说明:

  • -shared: 表示生成的是动态链接库
  • -fPIC: 生成位置独立的代码,用于编译共享库。在任意内存空间都可以被加载
  • -Wall: 生成所有警告信息

如果觉得本文不错,那就点个关注吧~ 关于更多的面试资料我已经整理成相关文档,需要的朋友可以点击获取

 

C++静态库与动态库的区别的更多相关文章

  1. VS中Debug和Realease、及静态库和动态库的区别整理(转)

    原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...

  2. VS中Debug和Realease、及静态库和动态库的区别整理

    一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码 ...

  3. iOS静态库和动态库的区别

    一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用 ...

  4. iOS 静态库和动态库的区别&静态库的生成

    linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函 ...

  5. iOS中的静态库与动态库,区别、制作和使用

    如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ...

  6. Lib作为“静态库”与“动态库”中的区别

    Lib作为“静态库”与“动态库”中的区别 0. 前言: 什么是静态连接库: 静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中.因此对应的链接方式称为静态链接. 为什么 ...

  7. iOS 中的静态库与动态库,区别、制作和使用

    如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ...

  8. (转)iOS静态库与动态库的区别

    一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用 ...

  9. 静态库和动态库的区别和win平台和linux平台代码实现

    静态库和动态库的区别   什么是库 库是写好的,现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说,库是一种可 ...

随机推荐

  1. LeetCode 886. Possible Bipartition

    原题链接在这里:https://leetcode.com/problems/possible-bipartition/ 题目: Given a set of N people (numbered 1, ...

  2. SQL Server 定期归档大表历史数据

    很少有开发会考虑到数据归档的问题已经数据增长的问题,当程序运行一段时间后,就会出现各种问题,部分问题可以修改SQL语句或使用索引来解决,但如果SQL语句无法修改,糟糕的SQL语句无法使用索引,归档历史 ...

  3. Numpy | 07 从数值范围创建数组

    numpy.arange ***** 使用numpy 包中的 arange 函数,创建数值范围并返回 ndarray 对象,函数格式如下: numpy.arange(start, stop, step ...

  4. ent 基本使用十九 事务处理

    ent 生成的代码中client 提供了比较全的事务处理 启动单个事务进行处理 // GenTx generates group of entities in a transaction. func ...

  5. Linux下的C++ socket编程实例

    阅读目录 基本的局域网聊天 客户端服务端双向异步聊天源码 局域网内服务端和有限个客户端聊天源码 完美异步聊天服务端和客户端源码 C++定时器 select异步代码 pthead多线程 服务端: 服务器 ...

  6. 怎么把ubuntu升级到最新版本

    首先是Ctrl+Alt+T 打开终端,然后在终端中输入指令(更新资源) sudo apt-get update 接着是对软件进行升级.(这是一个漫长的过程,需要下载资源) sudo apt-get u ...

  7. CSS注册页面案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. mvc基础配置

    视图解析器 在spring-mvc文件中编写 <!--配置视图解析器--> <bean class="org.springframework.web.servlet.vie ...

  9. 第10组 Alpha冲刺(1/4)

    队名:凹凸曼 组长博客 作业博客 组员实践情况 童景霖 过去两天完成了哪些任务 文字/口头描述 学习Android studio和Java,基本了解APP前端的制作 完善项目APP原型 展示GitHu ...

  10. Spring Boot 之配置导入,强大到不行!

    我们知道在 Spring Boot 中可以用一个 @Configuration 配置文件来配置所有 Bean 及其他配置(不会的看这篇文章:Spring零配置之@Configuration注解详解), ...