`
hlidc
  • 浏览: 27634 次
  • 性别: Icon_minigender_2
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

举例分析Linux动态库和静态库

阅读更多
函数库分为静态库和动态库两种。创建Linux静态库和Linux动态库和使用它们在这里将以举例的形式详述一下。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

  第1步:编辑得到举例的程序——hello.h、hello.c和main.c;

  hello.h(见程序1)为该函数库的头文件。

  hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"Hello XXX!".

  main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello.

  --------------------------------------------------------------------------------

  程序1: hello.h #ifndef HELLO_H #define HELLO_H void hello(const char *name);#endif //HELLO_H

  --------------------------------------------------------------------------------

  程序2: hello.c #include void hello(const char *name)

  { printf("Hello %s!\n", name);}

  --------------------------------------------------------------------------------

  程序3: main.c #include "hello.h" int main()

  { hello("everyone");return 0;}

  --------------------------------------------------------------------------------

  第2步:将hello.c编译成。o文件

  无论静态库,还是动态库,都是由。o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成。o文件。在系统提示符下键入以下命令得到hello.o文件。

  # gcc -c hello.c

  第3步:由。o文件创建静态库

  静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为。a.例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a.在创建和使用静态库时,需要注意这点。创建静态库用ar命令。在系统提示符下键入以下命令将创建静态库文件libmyhello.a.

  # ar cr libmyhello.a hello.o

  第4步:在程序中使用静态库

  静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名。a得到的静态库文件名来查找静态库文件。在程序3:main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello.下面先生成目标程序hello,然后运行hello程序看看结果如何。

  # gcc -o hello main.c -L. -lmyhello # ./hello Hello everyone!

  #

  我们删除静态库文件试试公用函数hello是否真的连接到目标文件 hello中了。

  # rm libmyhello.a rm: remove regular file `libmyhello.a'? y # ./hello Hello everyone!

  #程序照常运行,静态库中的公用函数已经连接到目标文件中了。我们继续看看如何在Linux中创建动态库。我们还是从。o文件开始。

  第5步:由。o文件创建动态库文件

  动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为。so.例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyhello.so.用gcc来创建动态库。在系统提示符下键入以下命令得到动态库文件libmyhello.so.

  # gcc -shared -fPCI -o libmyhello.so hello.o

  第6步:在程序中使用动态库

  在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明动态库名进行编译。我们先运行gcc命令生成目标文件,再运行它看看结果。

  # gcc -o hello main.c -L. -lmyhello # ./hello./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory #哦!出错了。快看看错误提示,原来是找不到动态库文件libmyhello.so.程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件libmyhello.so复制到目录/usr/lib中,再试试。

  # mv libmyhello.so /usr/lib # ./hello Hello everyone!

  #成功了。这也进一步说明了动态库在程序运行时是需要的。

  我们回过头看看,发现使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?抱着对问题必究到底的心情,来试试看。先删除 除。c和。h外的 所有文件,恢复成我们刚刚编辑完举例程序状态。

  # rm -f hello hello.o /usr/lib/libmyhello.so # ls hello.c hello.h main.c #在来创建静态库文件libmyhello.a和动态库文件libmyhello.so.

  # gcc -c hello.c # ar cr libmyhello.a hello.o # gcc -shared -fPCI -o libmyhello.so hello.o # ls hello.c hello.h hello.o libmyhello.a libmyhello.so main.c #通过上述最后一条ls命令,可以发现静态库文件libmyhello.a和动态库文件libmyhello.so都已经生成,并都在当前目录中。然后,我们运行gcc命令来使用函数库myhello生成目标文件hello,并运行程序 hello.

  # gcc -o hello main.c -L. -lmyhello # ./hello./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory #从程序hello运行的结果中很容易知道,当Linux静态库和Linux动态库同名时, gcc命令将优先使用动态库。

温情提示:有服务器的问题及服务器租用、托管需求的朋友联系www.163ns.com QQ:6041800 联系人:小郑
分享到:
评论

相关推荐

    libsrc.rar_linux 动态库

    linux 下面动态库和静态库的生成和使用实例,含有makefile

    Linux静态库与动态库实例详解

    主要介绍了 Linux静态库与动态库实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下

    linux下C++动态链接C++库示例

    文中是linux下 C++动态库 实现接口提供类导出的一个例子 注意其中使用函数返回基类指针的用法,因为Linux的动态链接库不能像MFC中那样直接导出类 一、介绍 如何使用dlopen API动态地加载C++函数和类,是Unix C++...

    linux shell下的静态链接库和动态链接库实例(脚本).docx

    linux shell下的静态链接库和动态链接库实例(脚本).docx

    CxImage 7.02编译好的静态库和动态库以及实例

    CxImage 7.02编译好的静态库和动态库以及例子,例子是VS2010 MFC 对话库程序 调用的是CxImage静态库 亲测可以用

    delphi编写so库,及调用实例,linux下运行,Deepin系统

    delphi编写so库,及调用实例,linux下运行,Deepin系统

    PowerPC 动态库

    作者首先简单介绍了符号静态解析和动态解析的不同之处,接着分析了和动态解析相关的概念,然后讲述PowerPC Linux是如何作动态符号解析的,并辅以实例详细说明

    linux ar 命令的使用说明和实例讲解

    ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,里面包含了按照...关于Linux下的库文件、静态库、动态库以及怎样创建和使用等相关知识,参见本文后面的相关资料【3】《关于Linux静态库和

    linux网络编程-宋敬彬-part3

    2.2.8 生成和使用静态链接库 25 2.2.9 生成动态链接库 26 2.2.10 动态加载库 29 2.2.11 GCC常用选项 31 2.2.12 编译环境的搭建 33 2.3 Makefile文件简介 34 2.3.1 一个多文件的工程例子 34 2.3.2 多...

    linux网络编程-宋敬彬-part2

    2.2.8 生成和使用静态链接库 25 2.2.9 生成动态链接库 26 2.2.10 动态加载库 29 2.2.11 GCC常用选项 31 2.2.12 编译环境的搭建 33 2.3 Makefile文件简介 34 2.3.1 一个多文件的工程例子 34 2.3.2 多...

    完美编译libharu2.3.0开源PDF写入库

    libharu2.3.0开源PDF读写库,这是一个非常简洁短小的库,只依赖libpng和zlib库,使用非常方便。缺点是对Unicode支持不是很...完美编译了静态库、dll动态库四个版本,推荐使用dll版本库,不在额外需要其他静态库的链接。

    linux网络编程-宋敬彬-part1

    2.2.8 生成和使用静态链接库 25 2.2.9 生成动态链接库 26 2.2.10 动态加载库 29 2.2.11 GCC常用选项 31 2.2.12 编译环境的搭建 33 2.3 Makefile文件简介 34 2.3.1 一个多文件的工程例子 34 2.3.2 多...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例235 文件属性分析 304 实例236 文件类型检测 306 实例237 判断文件的权限 308 实例238 从文本文件中读取注册服务条款 309 实例239 可以屏蔽刷新功能的文本计数器 310 实例240 判断文件是否被修改 312 实例241 ...

    sqlite3数据库操作类

    本程序所使用的Makefile文件由本人创作(注释详细),可支持动态库编译、静态库编译等等,经过长时间优化积累,可通过简单修改参数适用于绝大部分应用场景。 本程序的调试输出使用的是本人自创的debug接口,以库的...

    vc++ 开发实例源码包

    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例235 文件属性分析 304 实例236 文件类型检测 306 实例237 判断文件的权限 308 实例238 从文本文件中读取注册服务条款 309 实例239 可以屏蔽刷新功能的文本计数器 310 实例240 判断文件是否被修改 312 实例241 ...

    Rockey1智能锁软件开发包SDK.

    SDK V1.0004-20121010 资料包括以下内容: API 程序开发时所需要的静态库、动态库、实例 API Docs Include Linux_V1.0_20120917 Samples - BCB C# Delphi Java JavaScript PB PHP VB VC Utilities

    宋劲彬的嵌入式C语言一站式编程

    3. 静态库 4. 共享库 4.1. 编译、链接、运行 4.2. 动态链接的过程 4.3. 共享库的命名惯例 5. 虚拟内存管理 21. 预处理 1. 预处理的步骤 2. 宏定义 2.1. 函数式宏定义 2.2. 内联函数 2.3. #、##运算符和可变参数 2.4....

Global site tag (gtag.js) - Google Analytics