文档章节

Head First C 第八章 静态库与动态库 创建动态库

AlexTuan
 AlexTuan
发布于 2016/04/02 17:13
字数 723
阅读 38
收藏 4

Head First C 第八章 静态库与动态库 创建动态库

动态库是什么

静态库文件,需要在链接过程中和主程序链接在一起,如果你想改变某个部分的功能,或者发布不同版本,就需要修改这个代码并全部重新编译,需要做很多的重复操作,因此引入动态库的概念,动态库不需要在编译时链接,更容易改变。

动态库的创建

静态库一样,创建静态库需要.o文件

  1. 创建.o文件 gcc -I./includes -fPIC -c hfcal.c -o hfcal.o -fPIC表示创建位置无关代码,现在大部分的操作系统都不需要输入这一命令。 -I指定头文件位置 -c表示只编译,-o表示目标文件路径和名称

位置无关代码,就是无论计算机把它加载到存储器的哪个位置,都可以运行的代码。

  1. 创建动态库 Linux下:gcc -shared hfcal.o -o ./libs/libhfcal.so Mac OS X下:gcc -shared hfcal.o -o ./libs/libhfcal.dylib 在Linux和Unix上,动态库被叫做共享目标文件,在Mac OS X上,叫做动态库,在Windows上叫作动态链接库。 静态库使用ar命令生成的,而动态库要用gcc。

如何使用动态库

  1. 我们有了主程序代码的目标文件(.o),我们可以使用和静态库一样的方式来编译主程序。 gcc elliptical.o -I./includes -L./libs -lhfcal -o elliptical 虽然命令一样,但是gcc做的事却不尽相同,使用静态库时,gcc会把静态库和主程序目标文件统统缝合在一起,但是使用动态库时,gcc只会在目标可执行文件中插入一段用来查找库位置的占位符,在运行时去链接。 这么看起来动态链接库这个名字取得棒极了。
  2. 不同系统下动态库的使用 在Mac OS X 下,编译程序时,会把动态库的路径保存在可执行文件中,程序运行时知道从哪里去找这个动态库。 在Windows中,会现在当前目录下查找,如果没找到,就会去找保存在PATH中的目录。 但在Linux和大部分Unix中不一样,系统只会从环境变量LD_LIBRARY_PATH中查找动态库,我们有两种方法可以解决这个问题:
    1. 把我们的动态库拷贝到系统动态库目录下usr/local/lib
    2. LD_LIBRARY_PATH中添加我们的当前目录

修改程序的动态库

当我们的程序应用于不同场景,有一个动态库中的功能不再适用了,我们要做的就是,修改这一个动态库,与其他文件无关。

代码

dynamic library sample

© 著作权归作者所有

AlexTuan
粉丝 4
博文 27
码字总数 17966
作品 0
程序员
私信 提问
Head First C 学习日志 第八章 静态库与动态库 静态库的创建与使用

Head First C 学习日志 第八章 静态库与动态库 静态库: 静态库是1个或者一组目标文件.o的归档,在链接阶段使用,生成一个可执行文件。静态库引入的原因是,当你的程序由多个源文件构成,而你...

AlexTuan
2016/04/01
26
0
Linux下gcc生成和使用静态库和动态库详解

一、基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于windows和linux的平台不同(主要是编...

lwaif
2018/01/13
83
0
静态库与共享库制作与应用

1、什么是库 在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼...

长平狐
2012/09/03
255
0
在Linux中创建静态库和动态库范例 (hello.c)

我们通常把一些公用函数制作成函数库,供其它程序使用。 函数库分为静态库和动态库两种。 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译时并不...

AlphaJay
2010/05/31
1K
0
Linux下静态库和动态库(共享库)的制作与使用

Linux下静态库和动态库(共享库)的制作与使用 Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。 静态函数库...

木雨山
2011/07/29
121
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部