`
ericbaner
  • 浏览: 177520 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

linux下如何编写动态链接库

阅读更多

1.编写库的头文件和源文件.


2.把所有涉及到的源文件用如下方式编译为目标文件:

# g++/gcc -g -c -fPIC -o library1.o library1.cpp
# g++/gcc -g -c -fPIC -o library2.o library2.cpp
# ......
#


3.把所有的目标文件链接为动态库:

#g++/gcc-g-shared-Wl,-soname,libyourlibname.so -olibyourlibname.so.1.0.0 library1.olibrary2.o ... -lc

4.建立一个库名链接

# ln -s libyourlibname.so.1.0.0 libyourlibname.so

5.如何使用动态链接库


# 假如你的应用程序源代码叫test.cpp
# 采用如下方式编译:
# g++ -g -o test -L./ -lyourlibname test.cpp

6. 查看一个程序链接了哪些库用ldd

# ldd test

7.查看一个程序有哪些符号用nm

#nm test

8. 去除一个程序的符号表用strip

#strip test

9. 从程序中找出一些信息用 string

#strings test

关于Linux的动态共享库的设置

可执行程序找不到要链接的动态共享库,这是Linux上面编译和运行程序很容易碰到的问题,通过上面的小例子,我们已经大致了解共享库的一点基本原理,接下来我们要探讨一下怎么设置程序寻找动态共享库的行为。

Linux操作系统上面的动态共享库大致分为三类:

1.操作系统级别的共享库和基础的系统工具库

比方说libc.so, libz.so, libpthread.so等等,这些系统库会被放在/lib和/usr/lib目录下面,如果是64位操作系统,还会有/lib64和/usr/lib64目录。如果操作系统带有图形界面,那么还会有/usr/X11R6/lib目录,如果是64位操作系统,还有/usr/X11R6/lib64目录。此外还可能有其他特定Linux版本的系统库目录。

这些系统库文件的完整和版本的正确,确保了Linux上面各种程序能够正常的运行。

2、应用程序级别的系统共享库

并非操作系统自带,但是可能被很多应用程序所共享的库,一般会被放在/usr/local/lib和/usr/local/lib64这两个目录下面。很多你自行编译安装的程序都会在编译的时候自动把/usr/local/lib加入gcc的-L参数,而在运行的时候自动到/usr/local/lib下面去寻找共享库。

以上两类的动态共享库,应用程序会自动寻找到他们,并不需要你额外的设置和担心。这是为什么呢? 因为以上这些目录默认就被加入到动态链接程序的搜索路径里面了。Linux的系统共享库搜索路径定义在/etc/ld.so.conf这个配置文件里面。这个文件的内容格式大致如下:

  1. /usr/X11R6/lib64
  2. /usr/X11R6/lib
  3. /usr/local/lib
  4. /lib64
  5. /lib
  6. /usr/lib64
  7. /usr/lib
  8. /usr/local/lib64
  9. /usr/local/ImageMagick/lib

假设我们自己编译安装的ImageMagick图形库在/usr/local/ImageMagick目录下面,并且希望其他应用程序都可以使用ImageMagick的动态共享库,那么我们只需要把/usr/local/ImageMagick/lib目录加入/etc/ld.so.conf文件里面,然后执行:ldconfig 命令即可。

ldcofig将搜索以上所有的目录,为共享库建立一个缓存文件/etc/ld.so.cache。为了确认ldconfig已经搜索到ImageMagick的库,我们可以用上面介绍的strings命令从ld.so.cache里面抽取文本信息来检查一下:
strings/etc/ld.so.cache|grepImageMagick

输出结果为:

  1. /usr/local/ImageMagick/lib/libWand.so.10
  2. /usr/local/ImageMagick/lib/libWand.so
  3. /usr/local/ImageMagick/lib/libMagick.so.10
  4. /usr/local/ImageMagick/lib/libMagick.so
  5. /usr/local/ImageMagick/lib/libMagick++.so.10
  6. /usr/local/ImageMagick/lib/libMagick++.so

 

已经成功了!

3、应用程序独享的动态共享库

有很多共享库只被特定的应用程序使用,那么就没有必要加入系统库路径,以免应用程序的共享库之间发生版本冲突。因此Linux还可以通过设置环境变量LD_LIBRARY_PATH来临时指定应用程序的共享库搜索路径,就像我们上面举的那个例子一样,我们可以在应用程序的启动脚本里面预先设置LD_LIBRARY_PATH,指定本应用程序附加的共享库搜索路径,从而让应用程序找到它。

分享到:
评论

相关推荐

    linux动态链接库的开发实例

    本教程将通过一个实例深入探讨Linux下C/C++语言如何开发和使用动态链接库。 一、动态链接库基础 动态链接库与静态链接库(.a文件)的主要区别在于,静态链接库在编译时会将库中的代码合并到可执行文件中,而动态...

    linux动态链接库示例

    总结来说,"linux动态链接库示例"是一个关于如何在Linux环境下使用C语言创建、编译和使用动态链接库(`.so`文件)的过程。通过理解这些步骤,开发者能够更好地管理和利用系统资源,提高软件的复用性和维护性。

    Linux下使用动态链接库和静态链接库的项目建立及单步调试

    ### Linux下使用动态链接库和静态链接库的项目建立及单步调试 #### 一、动态链接库的建立和单步调试 ##### 1.1 编写用户接口文件 `datetime.h` 首先,创建了一个头文件`datetime.h`,该文件定义了两个结构体:`...

    Linux下qt动态库创建和使用

    本篇文章将深入探讨如何在Linux下的Qt环境中创建和使用动态库。 首先,创建动态库涉及以下步骤: 1. **项目设置**:在Qt Creator中,新建一个Qt Console Application项目。选择“New File or Project” -> ...

    linux创建和使用动态链接库.so文件

    通过以上步骤,你已经掌握了如何在 Linux 下创建和使用动态链接库 `.so` 文件的基本方法。这些技能对于开发复杂的软件项目尤其有用,因为它们允许你轻松地管理不同组件之间的依赖关系,并提高代码的可重用性。

    Linux C静态链接库与动态链接库编程简单介绍

    在Linux系统中,C语言的库分为静态链接库和动态链接库两种类型,它们都是为了实现代码重用和模块化设计的重要工具。本篇文章将深入浅出地介绍这两种链接库的原理、创建方法以及如何在程序中使用。 一、静态链接库 ...

    深入分析Windows和Linux动态库应用异同 动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。

    在软件开发领域,动态链接库(Dynamic Link Library,简称DLL)技术是提高程序效率和灵活性的关键手段之一。无论是在Windows还是Linux这样的不同操作系统环境中,动态库都发挥着重要的作用。通过动态链接的方式,...

    Linux静态动态链接库的创建和使用

    本文介绍了在Linux环境下如何创建和使用静态链接库及动态链接库的方法。通过具体的示例代码和步骤,我们可以看到,无论是静态链接库还是动态链接库,都有其特定的用途和优势。静态链接库适用于那些不希望外部改动或...

    Linux系统中动态链接库的创建及其使用

    Linux系统通常将动态链接库放在`/lib`或`/usr/lib`目录下,但为了演示,我们暂时不考虑这一点。 5. **使用动态链接库**: 在其他程序中使用动态链接库,需要包含对应的头文件(`#include "datetime.h"`),并且在...

    LINUX系统中动态链接库的创建与使用

    在Linux环境下,动态链接库通常被称为共享对象(Shared Object),以`.so`作为文件扩展名。本文将详细介绍如何在Linux系统中创建和使用动态链接库,通过实例讲解整个过程。 #### 二、Linux动态链接库的优势 1. **...

    LINUX动态链接库高级应用

    动态链接库(Dynamic Link Library),在LINUX环境下通常被称为共享对象(Shared Object),是一种可被多个程序同时加载并使用的库文件。它们以`.so`为扩展名,主要用于实现代码和数据的共享,从而提高系统的资源...

    cjson编译好的动态链接库,so和dll,32位

    这里的".so"是Linux下的动态链接库扩展名,代表"Shared Object",而".dll"则是Windows下的动态链接库扩展名。 "libcjson.so.1.6.0"是CJSON库的Linux 32位版本,"1.6.0"表示这是CJSON的一个特定版本。这个版本可能...

    linux下动态库的建立和使用

    例如,我们可以编写两个函数,一个用于查询当前日期getdate,一个用于查询当前时间gettime,并将这两个函数存于动态链接库my.so中。 首先,我们需要编写用户接口文件datetime.h,内容如下: /* datetime.h : 纵横...

    Linux动态链接库.so文件的创建与使用

    在Linux系统中,动态链接库(Dynamic Linking Library,通常以`.so`为扩展名)是一种重要的编程资源,它允许程序共享代码,从而节省内存并提高执行效率。本篇文章将深入探讨如何创建和使用`.so`文件,以及相关的重要...

    Linux静态and动态链接库 创建和使用

    ### Linux静态和动态链接库创建和使用 #### 概述 在软件开发过程中,经常会遇到相同功能模块在多个项目中重复出现的情况。例如,多个项目可能都需要实现用户验证功能。为了避免代码重复,提高代码的可维护性和重用...

    Matlab动态链接库编程

    动态链接库(Dynamic Link Library,简称DLL)是一种Windows操作系统下的程序模块,包含可被多个应用程序共享的代码、数据和资源。DLL技术使得程序在运行时动态加载所需代码成为可能,而非在编译阶段就将所有代码...

    opencv-2.4.12版本已编译linux-arm动态链接库

    这个压缩包包含的是OpenCV的2.4.12版本,针对Linux ARM架构的预编译动态链接库。在嵌入式系统,如树莓派、开发板等运行Linux操作系统的ARM设备上进行图像处理和视觉应用开发时,这样的库非常有用。 OpenCV 2.4.12是...

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

    总结来说,Linux Shell下的静态链接库和动态链接库各有优缺点。静态链接库使程序自包含,但文件较大;动态链接库节省磁盘空间,但需要管理运行时的库依赖。在实际开发中,应根据项目需求和系统环境选择合适的链接...

    java调用动态链接库实例 java调用动态链接库实例 java调用动态链接库实例

    下面我们将详细讨论如何在Java中调用动态链接库,并以Linux环境下的SO库为例,提供一个实例。 1. **Java Native Interface (JNI)**: JNI是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。JNI...

Global site tag (gtag.js) - Google Analytics