linux下lib说明
说明:本文是自己对以前学习的一个总结,并提供了例子代码(包括静态库、共享库、动态加载共享库)下载,下载地址:
http://pickup.mofile.com/0760747733420493
一、lib类型:
与windows下静态库(.lib)和动态库(.dll)一样,linux同样存在静态库(static library 文件后缀为.a)和共享库(shared library 文件后缀为.so),在/usr/lib目录下同时存在一个库的静态版本和动态版本。
"An archive (or static library) is simply a collection of object files stored as a single file.
When you provide an archive to the linker, the linker searches the archive for the object files
it needs, extracts them, and links them into your program much as if you had provided those
object files directly."
"A shared library is similar to a archive in that it is a grouping of object files. However,
there are many important differences.The most fundamental difference is that when a shared library is
linked into a program, the final executable does not actually contain the code that is
present in the shared library. Instead, the executable merely contains a reference to the
shared library."
"the object files that compose the shared library are combined into a
single object file so that a program that links against a shared library always includes all
of the code in the library, rather than just those portions that are needed."
以上引自《Advanced Linux Programming》
由此可知,静态库和共享库都是一个obj文件的集合,但静态链接后,执行程序中存在自己所需obj的一份拷贝,而动态链接后,执行程序仅仅是包含对共享库的一个引用。共享库相当于一个由多个obj文件组合而成的obj文件,在链接后其所有代码被加载,不管需要的还是不需要的。
似乎可以得出一个结论:
静态链接后的程序比动态链接的所用存储空间大,因为执行程序中包含了库中代码拷贝;
而动态链接的程序比静态链接的所用的运行空间大,因为它将不需要的代码也加载到运行空间。
二、lib编译:
静态库的编译,实际上是一个将.o文件打包的过程。
ar -rc libfunc.a func1.o func2.o # 将f1.o、f2.o编译成静态库libfunc.a
动态库的编译,使用gcc -fPIC -shared编译选项。
gcc -fPIC -shared -o libfunc.so func1.o func2.o # 将f1.o、f2.o编译成动态库libfunc.so
三、lib调用:
静态库的调用比较简单,跟标准库函数调用一样
一个例子:main.c调用./lib目录下libfunc.a库,该库头文件在./inc目录下,编译:
gcc -o test main.c -I./inc -L./lib -lfunc
共享库的调用需要注意库文件放置位置,如果该库文件不在/lib、/usr/lib下,则需要设置LD_LIBRARY_PATH变量。
一个例子:main.c调用./lib目录下libfunc.so库,该库头文件在./inc目录下,如果使用编译:
gcc -o test main.c -I./inc -L./lib -lfunc
./test # 运行错误:error while loading shared libraries: libfunc.so
这是因为动态链接时程序只是存放共享库的名称而不是绝对路径,所以运行时我们需要先设置该库所处位置:
export LD_LIBRARY_PATH=./lib
./test # 运行成功
动态装载共享库:在只有共享库而没有库的头文件,或者你想在运行时动态加载、卸载库时,linux的dl库函数:dlopen、dlclose、dlsym帮你办到,其相当于windows下LoadLibrary、FreeLibrary、GetProcAddress函数
函数原型:
void *dlopen(const char *filename, int flag);
void *dlsym(void *handle, char *symbol);
int dlclose(void *handle);
一个例子:main.c动态装载./lib目录下libfunc.so库,库中有一个函数void print_str(const char*);
/*加载库*/
void *handle = dlopen("libfunc.so", RTLD_LAZY);
/*获得函数的入口*/
void (*pt_str)(const char*);
pt_str = dlsym(handle, "print_str");
/*调用函数*/
pt_str("hello world.");
/*卸载库*/
dlclose(handle);
四、相关说明:
1、共享库特别适合多个程序共享代码,升级程序部分功能模块,实现程序“插件”功能的情况;
而静态库是一劳永逸,编译后不需要带一堆库文件跑,而且不管放置到哪里都可正常运行。
2、当搜索的库文件目录下同时存在该库的静态版本和共享版本时,链接器优先使用共享版本.so,此时你可以使用-static链接选项指定链接静态版本.a。
3、动态库可以导出两个特殊的函数:_init和_fini,前者在动态库被加载后调用,后者在动态库被卸载前调用,
我们可以使用这两个函数做些特别的工作。需要注意的是:在定义这两个函数后编译时,需要使用
-nostartfiles选项,否则编译器报重复定义错误。
4、ldd命令用来查看程序所依赖的共享库,同时也方便我们判断共享库是否被找到;
nm命令查看obj文件(.so也是一个obj)中的标识(函数、变量)。
分享到:
相关推荐
Linux rga说明文档详细介绍了Rockchip公司提供的librga库,这是一个专门为Linux环境定制的图形处理硬件加速库。librga库能够支持包括裁剪、格式转换、图片叠加、填色等在内的多种图形处理任务。本文档的目的是为...
在这个例子中,"pyg_lib-0.3.1+pt21cpu-cp39-cp39-linux_x86_64.whl"是Pyg_Lib的预编译版本,可以直接通过pip进行安装,无需再进行编译过程,极大地提高了安装效率。 在安装Pyg_Lib之前,我们需要运行以下命令来...
标题中的"pyg_lib-0.4.0+pt21cpu-cp39-cp39-linux_x86_64.whl.zip"是一个Python软件包,它封装了名为`pyg_lib`的库,版本号为0.4.0。这个版本是专门为与PyTorch的一个特定构建(2.1.0+cpu)配合使用的,这意味着它是...
标题 "pyg_lib-0.2.0+pt20cpu-cp39-cp39-linux_x86_64whl.zip" 暗示我们正在处理一个Python库的压缩包,这个库名为 `pyg_lib`,版本号为 `0.2.0`,并且针对的是PyTorch的一个特定版本,即 `pt20cpu`,意味着它是与...
标题中的“pyg_lib-0.3.1+pt113cpu-cp38-cp38-linux_x86_64.whl.zip”是一个Python库的压缩包,其中包含了一个名为“pyg_lib”的特定版本(0.3.1+pt113cpu)的whl文件。whl文件是Python的二进制分发格式,用于方便地...
标题 "pyg_lib-0.2.0+pt113cpu-cp38-cp38-linux_x86_64.whl.zip" 暗示这是一个针对Python的库扩展,名为 "pyg_lib" 的特定版本。该版本为0.2.0,并带有后缀 "+pt113cpu",这表明它可能与PyTorch的一个特殊构建兼容,...
【Linux内核源代码说明】 Linux内核源代码是开源软件的一大典范,它允许开发者深入理解操作系统的工作原理,同时也提供了无数的机会进行定制和优化。本文将详细介绍如何在Linux内核源代码中查找特定的内核函数,...
标题中的"pyg_lib-0.1.0+pt113cpu-cp39-cp39-linux_x86_64.whl.zip"是一个Python库的压缩包,名为"pyg_lib",版本号为0.1.0,带有后缀"pt113cpu",表明它可能针对PyTorch的1.13.1 CPU版本进行了优化。"cp39-cp39"这...
在压缩包内的文件"pyg_lib-0.3.1+pt20cpu-cp39-cp39-linux_x86_64.whl"就是我们要安装的库本身,而"使用说明.txt"可能包含了关于如何安装和使用这个库的详细指导,包括可能的依赖、配置选项或者示例代码等。...
"/lib"目录存储着系统运行所需的动态链接库,这些库文件被多个应用程序共同使用,确保了代码的复用和效率。 "/lost+found"目录在ext2或ext3文件系统中用于存放因系统意外关闭导致的文件碎片,fsck工具会在系统启动...
重新登录后,在终端输入`arm-linux-gcc –v`命令,如果能看到关于编译器版本的信息,则说明交叉编译环境已成功搭建。 #### 扩展知识点 1. **交叉编译的基本概念**:交叉编译是指在一个平台上编译代码,使其能够在...
标题中的“pyg_lib-0.2.0+pt113cpu-cp37-cp37m-linux_x86_64.whl.zip”是一个Python库的压缩包文件,名为“pyg_lib”,其版本号为0.2.0,带有后缀“pt113cpu”,表明它与PyTorch的一个特定版本(可能是1.13.1+cpu)...
在Linux 64位服务器上安装Node.js环境是开发或部署JavaScript后端应用的重要步骤。本文将详细指导如何在这样的环境中配置Node.js,特别关注版本为v8.12.0的安装过程。 首先,我们需要了解Node.js。Node.js是一个...
标题中的"pyg_lib-0.2.0+pt20cpu-cp38-cp38-linux_x86_64whl.zip"指的是一款名为`pyg_lib`的Python库,版本号为0.2.0,带有特定的后缀`pt20cpu`,表明它是为PyTorch的2.0.1 CPU版本优化的。`cp38`和`cp38`分别代表...
标题中的"pyg_lib-0.4.0+pt21cpu-cp38-cp38-linux_x86_64.whl.zip"是一个Python软件包,它封装了名为`pyg_lib`的库,版本号为0.4.0,并带有后缀`pt21cpu`,这可能表示它优化了对PyTorch 2.1.0 CPU版的支持。...
此外,它还支持多种操作系统,如 Windows、Mac OS X 和各种Linux发行版,确保了跨平台的兼容性。 PDFlib GmbH 是这个库的开发者和版权所有者,该公司位于德国慕尼黑。他们为用户提供技术支持,包括商业许可证持有者...
其中,“pyg_lib”是库的名称,版本号为“0.1.0”,“pt113cpu”表示它是针对PyTorch 1.13.0 CPU版优化的,"cp310"意味着它兼容Python 3.10,而"linux_x86_64"表明这是为64位Linux系统设计的。文件扩展名".whl.zip...
标题中的“pyg_lib-0.4.0+pt21cpu-cp310-cp310-linux_x86_64.whl.zip”指的是一个Python库的压缩包,名为“pyg_lib”,其版本号是0.4.0,带有后缀“pt21cpu”,表明它优化了对PyTorch 2.1.0 CPU版本的支持。...