`

用gcc编译生成动态链接库*.so文件的方法

 
阅读更多
原文地址:/etc/ld.so.confhttp://blog.sina.com.cn/s/blog_4cce4f6a0100ms6f.html文件作者:方人也
    Linux 共享库

  Linux 系统上有两类根本不同的 Linux 可执行程序。第一类是静态链接的可执行程序。静态可执行程序包含执行所需的所有函数 — 换句话说,它们是“完整的”。因为这一原因,静态可执行程序不依赖任何外部库就可以运行。

  第二类是动态链接的可执行程序。
  静态可执行程序与动态可执行程序比较

  我们可以用 ldd 命令来确定某一特定可执行程序是否为静态链接的:
  # ldd /sbin/sln
  not a dynamic executable
  “not a dynamic executable”是 ldd 说明 sln 是静态链接的一种方式。现在,让我们比较 sln 与其非静态同类 ln 的大小:
  # ls -l /bin/ln /sbin/sln
  -rwxr-xr-x    1 root     root        23000 Jan 14 00:36 /bin/ln
  -rwxr-xr-x    1 root     root       381072 Jan 14 00:31 /sbin/sln
  如您所见,sln 的大小超过 ln 十倍。ln 比 sln 小这么多是因为它是动态可执行程序。动态可执行程序是不完整的程序,它依靠外部共享库来提供运行所需的许多函数。
  动态链接相关性
  要查看 ln 依赖的所有共享库的列表,可以使用 ldd 命令:
  # ldd /bin/ln
  libc.so.6 => /lib/libc.so.6 (0x40021000)
  /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
  如您所见,ln 依赖外部共享库 libc.so.6 和 ld-linux.so.2。通常,动态链接的程序比其静态链接的等价程序小得多。不过,静态链接的程序可以在某些低级维护任务中发挥作用。例如,sln 是修改位于 /lib 中的不同库符号链接的极佳工具。但通常您会发现几乎所有 Linux 系统上的可执行程序都是某种动态链接的变体。
  动态装入器
  那么,如果动态可执行程序不包含运行所需的所有函数,Linux 的哪部分负责将这些程序和所有必需的共享库一起装入,以使它们能正确执行呢?答案是动态装入器(dynamic loader),它实际上是您在 ln 的 ldd 清单中看到的作为共享库相关性列出的 ld-linux.so.2 库。动态装入器负责装入动态链接的可执行程序运行所需的共享库。现在,让我们迅速查看一下动态装入器如何在系统上找到适当的共享库。
  ld.so.conf
  动态装入器找到共享库要依靠两个文件 — /etc/ld.so.conf 和 /etc/ld.so.cache。如果您对 /etc/ld.so.conf 文件进行 cat 操作,您可能会看到一个与下面类似的清单:
  $ cat /etc/ld.so.conf
  /usr/X11R6/lib
  /usr/lib/gcc-lib/i686-pc-linux-gnu/2.95.3
  /usr/lib/mozilla
  /usr/lib/qt-x11-2.3.1/lib
  /usr/local/lib
  ld.so.conf 文件包含一个所有目录(/lib 和 /usr/lib 除外,它们会自动包含在其中)的清单,动态装入器将在其中查找共享库。
  ld.so.cache
  但是在动态装入器能“看到”这一信息之前,必须将它转换到 ld.so.cache 文件中。可以通过运行 ldconfig 命令做到这一点:
  # ldconfig
  当 ldconfig 操作结束时,您会有一个最新的 /etc/ld.so.cache 文件,它反映您对 /etc/ld.so.conf 所做的更改。从这一刻起,动态装入器在寻找共享库时会查看您在 /etc/ld.so.conf 中指定的所有新目录。
  
  ldconfig 技巧
  
  要查看 ldconfig 可以“看到”的所有共享库,请输入:
  
  # ldconfig -p | less
  还有另一个方便的技巧可以用来配置共享库路径。有时候您希望告诉动态装入器在尝试任何 /etc/ld.so.conf 路径以前先尝试使用特定目录中的共享库。在您运行的较旧的应用程序不能与当前安装的库版本一起工作的情况下,这会比较方便。
  LD_LIBRARY_PATH
  要指示动态装入器首先检查某个目录,请将 LD_LIBRARY_PATH 变量设置成您希望搜索的目录。多个路径之间用冒号分隔;例如:
  # export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"
  导出 LD_LIBRARY_PATH 后,如有可能,所有从当前 shell 启动的可执行程序都将使用 /usr/lib/old 或 /opt/lib 中的库,如果仍不能满足一些共享库相关性要求,则转回到 /etc/ld.so.conf 中指定的库。

http://blog.csdn.net/liuying_1001/article/details/6611106%5c


从静态库.a 转成动态库 .so的方式如下:

.a 是有一系列 .o 文件通过 ar 程序打包在一起的静态库,要把它转成动态库只需先解开,生成一堆 .o 文件,再通过编译器(比如 gcc 或 ifort,视具体情况而定)编成动态库即可。

ar -x libtest.a
gcc -shared *.o -o libtest.so

不过需要注意的是:

(1) 并非所有 .a 都能转成 .so,前提是 .a 解出的 .o 文件中含有“位置独立代码”,如果不含的话则无法生成 .so。而“位置独立代码”要求在编译生成 .a 时指定 -fpic 或 -fPIC 选项才行。所以,如果只有一个 .a 文件而没有相应源文件且这个 .a 中不含“位置独立代码”,那么它无法转成 .so 文件。

(2) 我觉得生成 .so 时应该用与生成 .a 时一样的编译器,如果不一样不知道是否会造成问题。




花下眠工作室: http://huaxiamian.cc
分享到:
评论

相关推荐

    GCC编译动态和静态链接库.pdf

    GCC 编译动态和静态链接库 GCC 编译动态和静态链接库是 Linux 应用开发中的一个重要组件,对于嵌入式 Linux 应用开发来说尤为重要。本文将详细介绍如何在 Linux 中创建静态库和动态库,以及使用它们。 静态库 ...

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

    ### Linux 创建和使用动态链接库 .so 文件 在 Linux 系统中,动态链接库(Dynamic Link Library,简称 DLL)通常以 `.so` 文件的形式存在,即 Shared Object 文件。动态链接库可以被多个程序共享使用,有助于减少...

    Linux下g++编译与使用静态库和动态库的方法

    我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的...

    使用c++编写和使用.so动态链接库

    在C++编程中,动态链接库(.so文件)是一种重要的技术,允许代码在运行时被加载和使用,而不是在编译时静态链接。这使得应用程序可以更灵活地使用库,便于更新和优化,同时也降低了内存占用。以下将详细介绍如何使用...

    FFmpeg Android armeabi-v7a arm64-v8a 动态链接库.so文件

    针对Android平台编译好的FFmpeg 3.4.5的动态链接库.so文件,包括armeabi-v7a arm64-v8a两个版本,包含头文件,包含x264,支持mediacodec硬解码h264,h265。可直接集成到工程中用于视频编辑、转码等。

    C编译 动态连接库 (.so文件)1

    本文将探讨如何在UNIX环境下,特别是Ubuntu系统中,使用GCC编译器创建和使用动态链接库。 首先,理解动态链接库(.so文件)的基本概念。在UNIX系统中,动态链接库是一种在程序运行时被加载到内存中的共享代码库。...

    MuPDF1.0编译生成的libmupdf.so文件

    本资源提供的"libmupdf.so"是MuPDF的核心动态链接库,主要服务于Android平台,适用于开发者集成到自己的应用中,实现PDF文档的查看和处理功能。 在Android开发中,NDK(Native Development Kit)允许开发者使用C和...

    gcc编译动态链接库[参考].pdf

    首先,我们来看如何编译生成动态链接库。以一个简单的示例为例,假设我们有头文件`so_test.h`和三个C源文件`test_a.c`、`test_b.c`、`test_c.c`。`so_test.h`包含了三个函数声明:`test_a()`、`test_b()`和`test_c()...

    linux下如何生成使用静态和动态链接库

    在 Linux 中,可以使用 gcc 命令生成动态链接库。例如,要生成一个名为 libh.so 的动态链接库,需要先编译 h.c 文件生成目标文件 h.o,然后使用 gcc 命令将 h.o 文件链接到 libh.so 中。 gcc -c h.c -o h.o gcc -...

    linux下用gcc生成静态库和动态库.doc

    3. 在使用动态库的程序中,除了指定库路径(`-L`)和库名(`-l`),还需要确保运行环境能找到动态库,通常通过设置`LD_LIBRARY_PATH`环境变量或安装到系统默认的动态链接库路径。 4. 运行程序,如`./main`,如果...

    gcc静态库与动态库生成

    在嵌入式开发领域,了解如何使用gcc工具链来构建和管理静态库(`.a`文件)与动态库(`.so`文件)是非常重要的。本文将详细介绍如何通过gcc创建这两种类型的库,并讨论它们各自的用途、优缺点以及在实际项目中的应用...

    Centos8 下编译生成的 opencv4.5.5 生成.jar与so

    对于C/C++编程,我们还需要生成动态链接库`.so`文件。在上面的构建过程中,`make`命令已经生成了`.so`文件,它们位于`build/lib`目录下。例如,`libopencv_java455.so`就是Java使用的OpenCV动态链接库。在C/C++程序...

    linux下编译.so库文件

    在Linux环境下编译.so库文件是一项关键技能,尤其对于软件开发者而言。本文将深入解析Linux下编译.so库文件的过程,以及与之相关的静态库和动态库的基本概念,旨在为读者提供一个全面的理解。 ### 一、理解库文件...

    Linux下Gcc生成和使用静态库和动态库详解

    ### Linux下Gcc生成和使用静态库和动态库详解 #### 一、基本概念 **1.1 什么是库** 库本质上是一种可执行代码的二进制形式,它可以被操作系统载入内存执行。无论是Windows还是Linux平台,都广泛地使用着库。然而...

    libssh2的ubuntu下编译so

    标题"libssh2的ubuntu下编译so"指出,这是一个关于在Ubuntu 16.04操作系统环境下编译libssh2库的动态链接库(.so文件)的过程。libssh2是一个开源项目,提供SSH2协议的C语言实现,用于安全的远程连接和文件传输。它...

    静态库.a与.so库文件的生成与使用.pdf

    共享库又称为动态链接库,在程序运行时,库文件被映射到进程的地址空间并被动态链接。共享库的生成和使用过程如下: 2.1 生成目标文件(.o):与静态库不同,生成共享库的目标文件时必须添加编译选项“-fpic”,这样...

    linux下构建多目录下Makefile产生so动态库样例

    `ar`用于创建静态库,`gcc`的`-shared`选项用于生成动态库,`-Wl,-rpath=.`让链接器在当前目录查找动态库。 注意,`LDFLAGS`通常包含链接器的附加选项,如库搜索路径和链接器标志。`CFLAGS`则用于编译时的选项,...

    LINUX下简单的编译和使用动态链接库

    例如,使用 `c++` 编译器和 `gcc` 编译器来编译和链接生成动态链接库。 下面是一个简单的例子,用于生成一个 .so 文件并使用它: 首先,创建以下文件: * ConfigMap.cpp 和 ConfigMap.h(读取配置文件类) * ...

    使用c语言编写动态链接库(linux下.so文件,windows下dll文件),使用python调用c语言接口。.zip

    本示例涉及到的是使用C语言创建动态链接库,并在不同的操作系统环境下——Linux(生成`.so`文件)和Windows(生成`.dll`文件)——进行实现。之后,我们还将讨论如何通过Python语言调用这些C语言编写的接口。这一...

Global site tag (gtag.js) - Google Analytics