静态/动态函数库设计

Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供。

两者区别:

一、函数库分类

函数库按照链接方式可分为:

1.静态链接库

  对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件 (executable file)。程序 在运行 时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件 名为“libxxx.a”的形式。

  特点:程序所要用到的库函数代码在链接时全部被copy到程序中。

  缺点:如果有多个进程在内存中同时运行,并且使用了相同的库函数,那么就会有多份拷贝,这就是对空间的浪费。

2. 动态链接库

  把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是动态链接库(dynamic link library)技术。

二、函数库存放位置

  Linux应用程序使用的主要函数库均存放于/lib, /usr/lib目录下,其中采用*.so.*方式命名的是动态函数库,而以*.a方式命令的是静态函数库。

2.1静态库-编译选项

  1.Linux下进行链接时默认是链接动态库

  2.如果需要使用静态库,需要使用编译选项  -static

例:gcc –static test.c -o test

2.2制作静态库

  1. gcc –c mylib.c –o mylib.o

  2. ar cqs libmylib.a mylib.o

表示:

(1) 生成静态库的文件名是 libmylib.a

(2) c 表示无提示模式创建文件包

(3) q 表示在文件包尾加入 mylib.o

(4) s 强制重新生成文件包的符号表

  3. 将制作好的libmylib.a 复制到/usr/lib

2.3使用静态库-编译选项

-lname:

  GCC在链接时,默认只会链接C函数库,而对于其他的函数库,则需要使用-l选项来显示地指明需要链接。

例:gcc test.c –lmylib -o test

  函数库命名时一般以lib开头libmylib.a但是使用-l链接时却不用加lib而是知己使用-lname

三、动态链接函数库

制作动态链接库:

1. gcc –c –fPIC mylib.c –o  mylib.o  //这里一定要加上-fPIC选项,不然下一步编译失败

2. gcc -shared –fPIC  mylib.o -o libmylib.so

  3. 将制作好的libmylib.so 复制到/usr/lib

-fpic 使输出的对象模块是按照可重定位地址方式生成的。-shared 指明产生动态链接库。

如果库是移植使用一定要注意使用和编译的时候系统位数一致,并且包含头文件定义要使用库的函数原型.在使用过程中将库复制到/usr/lib目录下面然后在编译可运行程序是-lmylib(-l是小写的L)就可,这里没有.so后缀。

如果将自己编译的.so文件存放到了其他的目录下面则可以通过-L来指定链接动态库的路径。比如gcc  wmx.c  -o  wmx  -L ./ -lmylib (动态库在当前目录下)

静态/动态函数库设计,王明学learn的更多相关文章

  1. 静态库与动态库的制作以及程序的动态函数库解析ldd;ldconfig与/etc/ld.so.conf

    静态库的制作步骤: (1)gcc -c mylib.c -o mylib.o (2)ar rc libmylib.a mylib.o 动态库的制作步骤: gcc -shared mylib.c -o ...

  2. 库函数系统调用文件方式,王明学learn

    库函数系统调用文件方式 基于C函数库的文件编程是独立于具体的操作系统平台的,不管是在Windows.Linux还是其他的操作系统中,都是使用这些函数.使用库函数进行程序设计可提高程序的可移植性. 对于 ...

  3. linux驱动程序设计的硬件基础,王明学learn

    linux驱动程序设计的硬件基础(一) 本章讲总结学习linux设备程序设计的硬件基础. 一.处理器 1.1通用处理器 通用处理器(GPP)并不针对特定的应用领域进行体系结构和指令集的优化,它们具有一 ...

  4. linux设备驱动概述,王明学learn

    linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...

  5. 进程控制理论,王明学learn

    进程控制理论 一.进程 进程是一个具有一定独立功能程序的一次运行活动. 1.1进程特点 1.动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的 2.并发性:任何进程都可以同其他进程一起 ...

  6. linux内核的组成,王明学learn

    linux内核的组成 一.linux内核源代码目录结构 arch: 包含和硬件体系结构相关的代码, 每种平台占一个相应的目录, 如 i386.ARM.PowerPC.MIPS 等. block:块设备 ...

  7. OK6410移植madplay播放器,王明学learn

    对于ok6410的madplay移植主要包括三部分.声卡驱动移植,播放器的移植,以及alsa库的移植. 一.首先移植声卡驱动以及播放器 ok6410采用WM97系列的声卡芯片,要使得内核支持该驱动,首 ...

  8. 消息队列通信,王明学learn

    消息队列通信 消息队列就是一个消息(一个结构)的链表.而一条消息则可看作一个记录,具有特定的格式.进程可以从中按照一定的规则添加新消息:另一些进程则可以从消息队列中读走消息. 每一个消息都是一个结构体 ...

  9. 共享内存同行,王明学learn

    共享内存同行 一.共享内存概念 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存, 这是传递数据的一种非常有效的方式. 二.函数学习 这里主要有创建共享内存.映射共享内存.分离共享内 ...

随机推荐

  1. Minimum Adjustment Cost

    Given an integer array, adjust each integers so that the difference of every adjacent integers are n ...

  2. Unity3d 鼠标拣选小功能集合

    最近在做一些优化工具,把鼠标拣选的功能单独抽出来. 可遍历所有选中的某类型资源,会递归文件夹 可编译所有prefab的某个Component,也是递归的 using UnityEngine; usin ...

  3. DELPHI控件:DBLookupComboBOX组件的使用方法

    在许多数据表中,数据是以代码方式存放的,如在班级编码数据表tB03(表5.5)中,系部字段TB0309采用编码方式存放,系部真实名称则存放在系部编码表TB06.使用代码的好处是,用户可在编码表TB06 ...

  4. sql语句全集

    --删除外键alter table AdItem drop constraint AdOrder_AdItem_FK1(外键名称) --增加外键alter table AdItem add const ...

  5. C#二维数组

    数组格式 一维数组: Console.WriteLine("输入班级人数"); int renshu = int.Parse(Console.ReadLine()); ; i &l ...

  6. jsp通过s:hidden传值给后台,后台数据出现了若干逗号问题

    <s:iterator value="rpActionVO.page.result" id="list" status="st"> ...

  7. IOS - AFN

    #import "ViewController.h"#import "AFNetworking.h"#import "SSZipArchive.h&q ...

  8. ZendStudio如何汉化

    点击工具栏的help,看图 点击 Install New Sofaware...   看图 然后.... 在地址(12.0的版本):http://download.eclipse.org/techno ...

  9. [Android Pro] Java进阶学习:jar打包详解

    jar文件听说过吗,没有?或者陌生!好,没关系,这就是我们的第一站:打包发布. 为什么会有这个玩意呢,首先,这是jar的全称:JavaTM Archive (JAR) file,是的,就是java存档 ...

  10. Jpinyin笔记