`
laoyao319
  • 浏览: 12814 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

Linux操作系统下动态库的生成及链接方法

阅读更多

Linux下动态库文件的扩展名为".so"(Shared Object)。按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号)。这样,线程函数库被称作 libthread.so。静态库的文件名形式是libname.a。共享archive的文件名形式是libname.sa。共享archive只是一种过渡形式,帮助人们从静态库转变到动态库。

 

本文仅以简单的例子介绍动态库文件的生成和链接方法。

操作系统:Debian/GNU Linux 2.6.21-2-686;

GCC版本:4.1.3

 

一、库文件及测试文件代码

 

库文件及测试文件所在的目录:/home/program/。

 

1.库文件名:myfunction.c

 

 

/*Author: Godbach
  E-mail: nylzhaowei@163.com
*/

#include <stdio.h>
int
my_lib_function (void)
{
    printf ("Library routine called from libmyfunction.so!\n");
    return 0;
}

 

2.测试文件名:test.c

 

 

#include <stdio.h>
int main(void)
{
    my_lib_function();
    return 0;
}

 

二、动态库的编译方法

 

编译库文件myfunction.c:

 

debian:/home/program# gcc -shared -o libmyfunction.so myfunction.c

 

如果编译成功,会在/home/program/下生成动态库文件:libmyfunction.so。

这里有两点需要说明:

1.对Linux操作,一般都推荐在普通用户模式下,如果需要超级用户的权限,则可以通过su root,输入root用户密码切换。我是个人学习使用,同时又有很多的操作都要使用root用户,因此就直接在root用户下进行编译。

 

2.编译生成动态库的命令为:gcc (-fpic) -shared -o libmyfunction.so myfunction.c

-fpic 使输出的对象模块是按照可重定位地址方式生成的。

-shared指定把对应的源文件生成对应的动态链接库文件。

 

三、动态库的测试方法

 

编译测试文件test.c:

 

debian:/home/program# gcc -o test test.c /home/program/libmyfunction.so

 

成功编译后,生成test文件,运行test:

 

debian:/home/program# ./test

Library routine called from libmyfunction.so!

 

其中,gcc -o test test.c /home/program/libmyfunction.so的最后一个参数指定所链接库文件的绝对路径。本例中库文件的绝对路径为:/home/program/libmyfunction.so。

 

当然,如果想从系统的库文件路径(通常系统函数库的位于/usr/lib下)链接动态库的话,可以先将生成的库文件拷贝至/usr/lib/下,然后再链接:

 

debian:/home/program# cp libmyfunction.so /usr/lib/

debian:/home/program# gcc -o test test.c -lmyfunction

debian:/home/program# ./test

 

Library routine called from libmyfunction.so!

 

这里,对于链接的方法作一下解释。对于gcc -o test test.c -lmyfunction中最后一个参数-lmyfunction,可见传给C编译器的命令行参数并未提到函数库的完整路径名,甚至没有提到在函数库目录中该文件的完整名字!实际上,编译器被告知根据选项-lmyfunction链接到相应的函数库(/usr/lib下),函数库的名字是 libmyfunction.so,也就是说,"lib"部分和文件的扩展名被省略了,但在前面加了一个"l"。

分享到:
评论

相关推荐

    Linux操作系统基础教程

    五.Linux操作系统上有什么应用?.....................................................................................4 六.在那里可以找到讨论区?..........................................................

    Linux窗口程序设计—Qt4精彩实例分析配书光盘_QT4源码及动态库(Linux+windows)

    qt4动态链接库,操作系统版本:Red Hat 9.0 二、使用实例源代码 各章的实例源代码在各章相应的目录下。  每个实例源代码目录下包含有:  源文件  工程文件(.pro)  Makefile文件(Makefile、Makefile.Release...

    UNIX操作系统教程 张红光

    第1章绪论.1 1.1操作系统概述1 1.1.1建立操作系统的目标1 1.1.2操作系统是用户与计算机的接口1 1.1.3操作系统是资源管理器2 1.2UNIX系统的主要特性3 1.3UNIX系统的发展史4 1.4开源软件与UNIX的推广发展6 1.4.1开源...

    Linux环境g++编译GDAL动态库操作方法

    –prefix=path表示设置GDAL的make install后的build目录,里面有生成的头文件和动态库。输入如下命令: ./configure --prefix=/root/Test/gdalbuild 这时可以发现目录中新生成了GDALmake.opt文件,该文件被包含在...

    linux网络编程-宋敬彬-part3

    第1章 Linux操作系统概述 2 1.1 Linux发展历史 2 1.1.1 Linux的诞生和发展 2 1.1.2 Linux名称的由来 3 1.2 Linux的发展要素 3 1.2.1 UNIX操作系统 4 1.2.2 Minix操作系统 4 1.2.3 POSIX 标准 4 1.3 ...

    linux网络编程-宋敬彬-part2

    第1章 Linux操作系统概述 2 1.1 Linux发展历史 2 1.1.1 Linux的诞生和发展 2 1.1.2 Linux名称的由来 3 1.2 Linux的发展要素 3 1.2.1 UNIX操作系统 4 1.2.2 Minix操作系统 4 1.2.3 POSIX 标准 4 1.3 ...

    《计算机操作系统》期末复习指导

    对考试很有帮助的.......... ...UNIX或Linux操作系统中文件系统的主要特点 (1)操作系统文件的目录组织是一个树形结构,从根结点到叶子称为文件的全路径名,文件可以由其全路径名唯一确定...

    Linux系统的使用(配置)

    Linux系统的配置,包括: 网络配置 环境变量配置 开机自启动设置 Linux动态链接库的生成与使用 Qt Creator工程文件配置

    VS2022编译的OpenCV4.8.0动态库及静态库

    OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。使用了Win10操作系统 VS2022编译器 CMake3.24.4构建工具 生成

    多线程编程实现矩阵乘法

    在Linux操作系统上,利用Pthread API编写应用程序实现矩阵乘法。  3. 在上述两种环境下,实现相乘操作的两个矩阵均作为应用程序的输入参数动态生成,并输出计算结果。  4. 在程序实现过程中,要求每个乘积矩阵...

    操作系统(内存管理)

    free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要理解...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    GCC 编译使用动态链接库和静态链接库的方法

    根据链接时期的不同,库又有静态库和动态库之分。 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。 有别于静态库,动态...

    linux网络编程-宋敬彬-part1

    第1章 Linux操作系统概述 2 1.1 Linux发展历史 2 1.1.1 Linux的诞生和发展 2 1.1.2 Linux名称的由来 1.2 Linux的发展要素 3 1.2.1 UNIX操作系统 4 1.2.2 Minix操作系统 4 1.2.3 POSIX 标准 4 1.3 Linux与...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

    你可以创建一个dll或动态库以便简化连接。  如果你要支持SSL(HTTPS)及压缩的话,可以安装OpenSSL及Zlib库。  gSOAP是独立开发包,不需要任何第三方的软件支持(除非你要用到OpenSSL及Zlib)。  与平台无关的...

    oasis:小型静态链接的linux系统

    它可能与您可能熟悉的其他基于Linux的操作系统有很多不同,并且与BSD相比可能更好。 有许多功能使其区别于其他操作系统: 完全静态链接。 基本系统中的所有软件都是静态链接的,包括显示服务器( )和Web浏览器( ...

    【QGIS跨平台编译】之【SpatiaLite跨平台编译】:源码及跨平台编译工程(支撑QGIS跨平台编译,以及二次研发)

    一、内容概况 QGIS是一个开源的、跨平台的地理信息系统(GIS)软件,用于浏览、编辑...编译后会自动生成头文件、库文件、动态库等。 当前采用的版本为spatialite-5.0.1,如果下载者,需要其他版本的,请在评论区留言。

    【QGIS跨平台编译】之【xercesc跨平台编译】:源码及跨平台编译工程(支撑QGIS跨平台编译,以及二次研发)

    一、内容概况 QGIS是一个开源的、跨平台的地理信息系统(GIS)软件,用于浏览、...编译后会自动生成头文件、库文件、动态库等。 当前采用的版本为xercesc-3.2.4,如果下载者,需要其他版本的xercesc,请在评论区留言。

Global site tag (gtag.js) - Google Analytics