`
fly_hyp
  • 浏览: 305727 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

怎样创建动态连接库(shared library)/dlls?

阅读更多

怎样创建动态连接库(shared library)/dlls?

创建动态连接库(shared libraries)的方法根据不同的系统有所不同。这个过程主要分两步;第一步要求包括在动态连接库中的目标必须首先是编译好的,通常需要某个编译选项指示这串代码是位置无关的(position-indepenent);第二步,是将这些目标连接在一起形成一个库文件。

这里是一个演示以上道理的小程序:

     /* shrobj.c 文件 */

     const char *myfunc()
     {
         return "Hello World";
     }

     /* shrobj.c 结束 */

     /* hello.c 文件 */

     #include <stdio.h>

     extern const char *myfunc();

     main()
     {
         printf("%s\n", myfunc());
         return 0;
     }

     /* hello.c 结束 */

     $ gcc -fpic -c shrobj.c
     $ gcc -shared -o libshared.so shrobj.o
     $ gcc hello.c libshared.so
     $ ./a.out
     Hello World
    

到目前为止,如果你希望库文件和它的创建过程是都可以移植的话,那么最好的办法是使用GNU Libtool程序包。它是个小型的工具程序套件,这些工具程序知道建立动态连接库的平台无关性;你可以只发布你的程序必要的部分,从而当一个安装者配置你的软件包时,他能决定生成什么库。Libtool程序包在不支持动态连接库的系统上也能工作得很好。它而且知道与GNU Autoconf程序和GNU Automake程序挂钩(如果你使用这些工具来管理你程序的编译创建过程)。

如果你不想使用Libtool程序包,那么对于gcc以外的编译器,你需要按照下面所列修改编译器参数:

AIX 3.2 使用 xlc (未证实)
     取消‘-fpic’选项,以‘-bM:SRE -bE:libshared.exp’取代‘-shared’。你并且
     需要创建一个名为‘libshared.exp’的文件保存一个所有输出符号(symbols to export)
     的列表,比如以上的范例程序,就需要输出‘myfunc’符号。另外,在连接库
     时使用‘-e _nostart’参数(在较新的AIX版本上,我相信应该将其变成‘-bnoentry’)。

SCO OpenServer 5 使用 SCO 开发系统(Development System) (未证实)
     如果你使用ELF(译者注:ELF:执行与连接格式Executable and Linking Forrmat,
     一种Unix可执行目标文件的格式)格式,那么共享库只能在OS5上可用,而它
     需要‘-belf’选项。并以‘-Kpic’取代‘-fpic’,在连接时使用‘cc -belf -G’。

Solaris 使用 SparcWorks 编译器
     以‘-pic’取代‘-fpic’,并以‘ld -G’取代‘gcc -shared’。
    

(鼓励大家提供更多的材料丰富上述列表)

其它要当心的问题:

 

  • AIX和(我相信)Digital Unix不需要-fpic选项,因为所有代码都是位置无关的。

  • AIX一般需要你创建一个‘输出文件’,即一个保存所有动态连接库中输出 符号的列表。一些连接器(linker)版本(可能只有SLHS连接器,是svld?)有一个 选项可以输出所有符号。

  • 如果你对于连接器想使用普遍的‘-l’参数来引用你的动态连接库,你必须 理解你的系统在实际运行时是怎样寻找动态连接库的。最普通的方法是使用 ‘LD_LIBRARY_PATH’环境变量,但是通常在连接时有一种其它选项可以 设定。

  • 大多数实现方法是在程序内部记录所希望的动态连接库在运行时的位置。这 样把一个动态连接库从一个目录移到另一个目录将导致程序无法工作。许多 系统对于连接器有一个选项用以设定希望运行时动态连接库的位置(比如在 Solaris系统上是‘-R’连接器选项,或者是‘LD_RUN_PATH’环境变量)。

  • ELF和a.out的实现方法可能有一个连接器选项‘-Bsymbolic’,它导致在库本 身内部的引用被解释好。否则,在这些系统上,所有符号的解释将推迟到最 后连接时再进行,这样在main程序中的单一函数将重载库中的对应函数。

分享到:
评论

相关推荐

    windows和linux下生成动态库的cmake示例

    - `add_library`: 创建库目标,`SHARED`参数表示创建动态库。 - `set(CMAKE_SHARED_LIBRARY_RUNTIME_CXX_FLAG)`: 在Linux上指定运行时库路径。 在跨平台开发中,CMake的`find_package`功能非常有用,它可以帮助你在...

    ffmpeg windows版本的动态库

    动态库(Dynamic Link Library,DLL)允许程序在运行时加载所需的代码,而不是在编译时就集成到可执行文件中,这样可以节省内存和磁盘空间,并方便更新库文件。 在Windows环境下,FFmpeg的动态库通常分为两个部分:...

    unix编程常见问题解答.pdf

    **6.3 怎样创建动态连接库(shared library)/dlls?** - 使用`gcc`编译器和特定的链接选项可以创建共享库。 **6.4 我能更改一个动态连接库里的目标吗?** - 更改共享库的目标通常涉及重新编译和链接库文件。 **6.5 ...

    My_First_Shared_Library:这里是按照tomd.xyz的示例创建自己的库并运行简单的Hello管道的示例

    在这个名为"My_First_Shared_Library"的项目中,我们看到一个开发者正试图按照某个教程(来源为tomd.xyz)来创建自己的库,并实现一个简单的“Hello”管道功能。这个过程通常涉及以下步骤: 1. **库的概念**:库是...

    MFC下DLL编程(图解)

    动态链接库(Dynamic Link Library,简称 DLL)是微软为 Windows 和 OS/2 操作系统设计的一种供应用程序在运行时调用的共享函数库。DLL 作为一种重要的共享组件,在 Windows 开发中占据着核心地位。本文将详细探讨在...

    Remote Library Injection-Jarkko Turkulainen

    在Linux系统中,动态链接库(Dynamic Linked Libraries, DLLs)被称作共享对象文件(Shared Object Files)。可以通过以下几种方式来加载这些文件: - **设置环境变量LD_PRELOAD**:通过设置LD_PRELOAD环境变量,...

    vc++运行库合集heiji(含Skylie必备库).rar

    VC++运行库合集是微软Visual C++编程环境中不可或缺的一部分,它包含了运行使用VC++编译的程序所需的各种动态链接库(DLLs)。这个“vc++运行库合集heiji(含Skylie必备库).rar”文件似乎是一个包含从VC++ 2005到...

    ffmpeg配置的库文件

    库文件(如`.a`静态库或`.so`动态库)是编译后的二进制代码,它们包含了FFmpeg的各种功能实现。在编译链接阶段,你需要指定这些库的位置,比如`-L/path/to/library`,并用`-lavcodec`等选项告诉编译器链接哪些库。 ...

    loadlibrary:将Windows动态链接库移植到Linux

    Windows中的动态链接库是DLL格式,而Linux系统中对应的则是SO(Shared Object)文件。两者都是运行时加载代码和数据的机制,但文件扩展名和加载机制有所不同。 2. **`LoadLibrary`与`dlopen`** - **`LoadLibrary`...

    VC++2013 x86 x64运行库

    VC++2013运行库包含了运行这些程序所需的关键动态链接库(DLLs),它提供了C++标准库、MFC、ATL(Active Template Library)等组件的支持。 **一、Win32与Win64运行库** 标题中提到的"Win32与Win64两个运行库...

    opencv3.1 linux 32位,64位 so 及window dll

    对于Linux系统,SO(Shared Object)文件是动态链接库的标准格式。32位和64位的库文件对应不同的处理器架构。如果你正在开发一个跨平台的应用,确保为所有目标平台提供正确的库至关重要。32位库适用于运行在32位系统...

    rxtx-2.2-linux-windowx-x64.zip

    RXTX的跨平台特性得益于其底层使用了动态链接库(DLLs on Windows, shared libraries on Linux),这些库实现了操作系统特定的串口操作。 在Windows环境中,压缩包中的"mfz-rxtx-2.2-20081207-win-x64.zip"文件包含...

    vs2008发布所需类库

    在软件开发过程中,使用Visual Studio 2008 (VS2008) 进行项目构建时,为了确保应用程序能够在目标系统上顺利运行,需要正确地配置运行时库以及相关联的动态链接库(DLLs)。这些DLLs通常包括但不限于标准C++库、MFC...

    Python-PythonMSS纯Python中使用ctypes的超快速跨平台多屏截图模块

    ctypes是Python的一个标准库,它允许Python程序调用C语言编写的动态链接库(DLLs on Windows,shared libraries on Unix-like systems)。Python MSS库就是通过ctypes来桥接这些底层的图形处理功能,从而提供高性能...

    如何在python中引用c/c++函数

    首先,导入`ctypes`库并加载动态库: ```python import ctypes load_library = ctypes.cdll.LoadLibrary library = load_library('./libpycall.so') ``` 接下来,我们可以调用`display`函数: ```python library...

    共享库

    共享库,也被称为动态链接库(DLLs)或动态库,在Unix/Linux系统中通常称为动态链接共享对象(.so文件)。这种机制允许多个程序共享同一份代码和数据,从而节省内存资源,降低软件体积,提高系统效率。 在Swift编程...

    Infragistics2

    在这个2.0版本中,包含了全面的DLL(动态链接库)文件,这些文件是.NET开发中的关键组成部分,提供了丰富的功能和控件供开发者使用。 DLL(Dynamic Link Library)是Windows操作系统中的一个重要概念,它是一种可...

    MAtlab与C,C#,VB接口电子书

    C++ Math Library是指MATLAB为C++环境提供的数学库,允许用户直接在C++程序中使用MATLAB的数学功能。 **1.3.1 MATLAB Syntax** 介绍MATLAB的语法特点,如变量定义、数据结构(数组、矩阵)、控制流语句等。 **...

    install.zip

    设置为ON,创建动态库。这里推荐设置为OFF,因为Release版本通常使用静态库。 - `WITH_CUDA`: 如果你的系统支持CUDA并希望利用GPU加速,可以开启此选项。 - `WITH_CONTRIB`: 勾选此选项,以包含contrib模块。 - `...

Global site tag (gtag.js) - Google Analytics