`
cuiyadll
  • 浏览: 203941 次
文章分类
社区版块
存档分类
最新评论

Linux下的 .o、.a、.so文件

    博客分类:
  • unix
 
阅读更多
工程里很多函数只是有声明,找不到实现的代码。因为那些实现代码已经编译成库所以看不见,我所看见的全是一堆头文件.

     .o.a.so文件都是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据。

优点:程序模块化,容易重新编译,方便升级。

分类:静态函数库(对应.a文件)、共享函数库(对应.so文件,类似于Windowsdll文件)、动态加载函数库(对应.o文件,相当于Windows里的.obj文件

 

静态函数库

特点:实际上是简单的普通目标文件的集合,在程序执行前就加入到目标程序中。

优点:可以用以前某些程序兼容;描述简单;允许程序员把程序link起来而不用重新编译代码,节省了重新编译代码的时间(该优势目前已不明显);开发者可以对源代码保密;理论上使用ELF格式的静态库函数生成的代码可以比使用共享或动态函数库的程序运行速度快(大概1%-5%

生成:使用ar程序(archiver的缩写)。ar rcs my_lib.a f1.o f2.o是把目标代码f1.of2.o加入到my_lib.a这个函数库文件中(如果my_lib.a不存在则创建)

使用:gcc生成可执行代码时,使用-l参数指定要加入的库函数。也可以用ld命令的-l-L参数。

 

共享函数库

    共享函数库在可执行程序启动的时候加载,所有程序重新运行时都可自动加载共享函数库中的函数。.so文件感觉很复杂,光是命名规则就已经看得我很晕了~整理一下,共享库需要:sonamereal name,另外编译的时候名字也有说法。依次解释下:

soname必须的格式:lib+函数库名+.so+版本号信息(但是记住,非常底层的C库函数都不是以lib开头命名的)。例子:/usr/lib/libreadline.so.3

real name:顾名思义是真正的名字啦,有主版本号和发行版本号。但是没找到实例……

编译器编译的时候需要的函数库的名字就是不包含版本号信息的soname,例如上面的例子把最后的.3去掉就可以了。

位置:共享函数库文件必须放在特定目录,对于开放源码来说,GNU标准建议所有的函数库文件都放在/usr/local/lib目录下,而且建议命令、可执行程序都放在/usr/local/bin目录下。不过这个只是习惯啦,可以改变,具体的位置信息可以看/etc/ld.so.conf里面的配置信息。当然,也可以修改这个文件,加入自己的一些特殊的路径要求。

创建:在网上找到了gcc方式和easyeclipse环境下两种创建方式。

gcc方式:

    首先创建object文件,这个文件将加入通过gcc –fPIC 参数命令加入到共享函数库里面,标准格式:gcc -shared -Wl,-soname,your_soname -o library_name file_list library_list(说实话这个标准格式看起来好复杂,我找了个实例,但是好像和那个标准格式稍有不同:gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

easyeclipse环境下生成.so文件:

        1.选择新建工程,建立一个c++工程

        2.在工程类型选项里选择 Shared Library,然后填入工程名字PXXX点击完成即可。

        3.编写程序,然后编译就会在debug或者release里生成一个libPXXX.so文件,如果不要lib的起头标记点击project菜单的Properties选项,然后在弹出的界面的右边点击Build artifact页面,将Output prefix选项的内容清空即可。

        4.如果是C++程序,注意在接口函数的前面加上extern "C"标记,在头文件加上如下标记:

#ifdef   __cplusplus  

#extern   "C"{  

#endif  

   

头文件主体  

   

#ifdef   __cplusplus  

}  

#endif  

     如果不加以上标记,经过编译后,so里的函数名并非你编写程序时设定的函数名,在开发环境左侧的工程文件列表中点开debug项里的PXXX.o可以看到so文件里的函数名都是在你设定的函数名后面加了一个__Fi标记,比如你用的设定的函数名称是Func(), so里的函数名则为Func__Fi()或者其他的名称。

安装:拷贝共享库文件到指定的标准的目录,然后运行ldconfig。如果没有权限这样做,那么就只好通过修改环境变量来实现这些函数库的使用了。方法不再说了,很复杂。

查看:可以通过运行ldd来看某个程序使用的共享函数库。例如ldd /bin/ls。查看.so文件使用nm命令,如nm libXXX.so。(注意,nm对于静态的函数库和共享的函数库都起作用)

关于覆盖:如果想用自己的函数覆盖某个库中的一些函数,同时保留该库中其他的函数的话,可以在/etc/ld.so.preload中加入要替换的库(.o结尾的文件),这些preloading的库函数将有优先加载的权利。

关于更新:每次新增加动态加载的函数库、删除某个函数库或者修改某个函数库的路径时,都要重新运行ldconfig来更新/etc/ld.so.cache

分享到:
评论

相关推荐

    linux.o,.a,.so文件解析.pdf

    Linux .o, .a, .so 文件解析 Linux 中的文件扩展名有很多种,例如 .o, .a, .so 等,这些文件都是编译过程中的中间产物或最终产物。下面我们将详细解释这些文件的含义和用途。 .o 文件是编译器生成的目标文件,相当...

    libsigar-amd64-linux.so和libsigar-x86-linux.so

    本文将深入探讨libsigar库及其在Linux环境下的两个关键组件:libsigar-amd64-linux.so和libsigar-x86-linux.so。 libsigar是一个跨平台的库,由Hewlett Packard Enterprise开发并维护,其主要目标是简化对操作系统...

    libsigar-amd64-linux.so以及libsigar-x86-linux.so

    标题中的"libsigar-amd64-linux.so"和"libsigar-x86-linux.so"是两个重要的库文件,它们属于Sigar(System Information Gatherer and Reporter)项目,一个跨平台的系统性能监控工具集。Sigar由Hewlett Packard ...

    libsigar-amd64-linux.so libsigar-x86-linux.so

    标题中的“libsigar-amd64-linux.so”和“libsigar-x86-linux.so”是两个重要的库文件,它们属于Sigar(System Information Gatherer and Reporter)库,一个跨平台的系统性能监控工具。在Java应用程序中,这些动态...

    linux下编译.so库文件

    在Linux系统中,库文件分为静态库和动态库两大类,它们分别以`.a`和`.so`作为文件扩展名,服务于不同的编译链接需求。 - **静态库**:通常包含多个`.o`目标文件的集合,用于在编译时链接到应用程序中。这意味着在...

    libc.so.6 libc.so.6

    在Linux系统中,`libc.so.6`是一个至关重要的动态链接库,全称为“GNU C Library”,它提供了大量用于程序开发的基础函数,如字符串处理、内存管理、I/O操作等。这个库是Linux系统上C语言编程的核心组成部分,几乎...

    linux下生成so文件并且调用so文件的方法

    在Linux环境下,生成和调用共享库(SO文件,即Shared Object)是常见的软件开发实践。SO文件允许多个程序共享同一段代码,节省内存并提高系统效率。下面将详细介绍如何生成SO文件以及如何在应用程序中调用它们。 一...

    so编写和Python调用.so文件

    本教程聚焦于如何在Linux环境下使用C++编写`.so`动态链接库,并通过Python进行调用,这对于初学者来说是一个很好的实践项目。`.so`文件是Linux系统中的动态链接库,它包含可被其他程序共享的函数和数据。 首先,...

    libstdc++.so.6: 无法打开共享对象文件: 没有那个文件或目录

    ### libstdc++.so.6: 无法打开共享对象文件: 没有那个文件或目录 #### 问题概述 用户在CentOS 7.6环境中遇到了“libstdc++.so.6: 无法打开共享对象文件: 没有那个文件或目录”的错误提示。该问题通常出现在尝试...

    linux jnative 调用.so方法及附属全部库和源码

    涉及文件:so_test.h test_a.c test_b.c test_c.c 终端执行命令:$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so 将编译得到到libtest.so拷贝到/usr/lib/,同时执行chmod 555 libtest.so 2.qt...

    springboot 报错:no libsigar-amd64-linux.so in java.library.path 时所需安装包

    在使用Spring Boot开发Java应用程序的过程中,可能会遇到一个特定的错误提示:“no libsigar-amd64-linux.so in java.library.path”。这个错误是由于系统缺少一个名为libsigar的库,特别是其AMD64架构的Linux版本,...

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

    在Linux环境下,构建多目录下的Makefile以生成.so动态库是一项常见的任务,特别是在大型软件项目中。这样的项目通常包含多个源文件,分布在不同的目录结构中,每个目录可能有自己的子Makefile,最终通过主Makefile来...

    Jmeter ServerAgent Arm架构 libsigar-aarch64-linux.so

    《Jmeter ServerAgent在Arm架构Linux上的应用与libsigar-aarch64-linux.so详解》 Jmeter,全称为Apache JMeter,是一款广泛使用的开源性能测试工具,它主要用于测试Web应用和服务的性能和负载。而ServerAgent是...

    centos7 x86-64 libstdc++.so.6.0.30

    《深入理解CentOS7 x86-64下的libstdc++.so.6.0.30库》 在Linux操作系统中,动态链接库扮演着至关重要的角色,它们提供了程序运行所需的共享函数和数据,使得多个程序可以共享系统资源,减少内存占用。其中,`...

    libcrypto.so.1.0.2k

    libcrypto.so.1.0.2k 文件

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

    总的来说,Linux动态链接库`.so`文件的创建和使用是系统编程中的关键技能,掌握这一技术有助于优化程序性能,实现模块化设计,并有效地管理系统资源。在实际开发中,了解如何创建、管理及使用动态链接库对于提升软件...

    libstdc++.so.6.0.21

    总之,`libstdc++.so.6.0.21`是Linux环境下C++编程不可或缺的一部分,它为开发者提供了丰富的C++标准库功能,并且通过动态链接的方式优化了系统资源的使用。了解和掌握这个库,对于理解和调试C++程序,特别是在...

    libstdc++.so.5.0.7和libstdc++.so.6.0.13

    这里的.so是共享对象(Shared Object)的简称,是Linux系统中的动态链接库文件格式。 1. **libstdc++.so.5.0.7**:这是较早版本的libstdc++,发布于20世纪末,主要服务于GCC的早期版本。它包含了C++98标准的实现,...

    libstdc++.so.6.0.25zip.zip

    在Linux系统中,libstdc++.so是一个动态链接库,其版本号(如6.0.25)反映了库的更新和改进。本文将详细探讨libstdc++.so.6.0.21与libstdc++.so.6.0.25之间的差异,以及在64位系统中如何正确链接和使用这些库文件。 ...

Global site tag (gtag.js) - Google Analytics