当前位置:首页 » 编程软件 » linux动态库静态编译

linux动态库静态编译

发布时间: 2024-11-24 19:38:24

1. linux下使用nm指令查看静态库/动态库编译内容

在Linux环境下,当你遇到链接库问题时,深入理解库的编译内容变得尤为重要。这时,nm指令就成为一个有效的工具,帮助我们揭示静态库和动态库内的编译细节。

首先,对于静态库,我们可以使用命令

nm -g libname.a

执行后,如图所示,它会列出静态库中的全局变量和函数接口,让你清晰地看到库的内部结构。

而对于动态库,其查看方式为

nm -g libname.so

同样会显示出动态库的编译内容,包括函数和符号,这对于定位和修复与库相关的bug时非常有用。

因此,在链接第三方库或处理bug时,记得利用nm指令来记录和分析库的编译内容,它能提供宝贵的线索和信息。

2. linux 静态库和动态库编译的区别

Linux库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so libhello.a
为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。
ln -s libhello.so.1.0 libhello.so.1
ln -s libhello.so.1 libhello.so

动态库和静态库的区别:
当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记‘指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

两种库的编译产生方法:
第一步要把源代码编绎成目标代码。以下面的代码hello.c为例,生成hello库:

/* hello.c */
#include
void sayhello()
{
printf("hello,world\n");
}
用gcc编绎该文件,在编绎时可以使用任何全法的编绎参数,例如-g加入调试代码等:
gcc -c hello.c -o hello.o
1.连接成静态库
连接成静态库使用ar命令,其实ar是archive的意思
$ar cqs libhello.a hello.o
2.连接成动态库
生成动态库用gcc来完成,由于可能存在多个版本,因此通常指定版本号:
$gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o
另外再建立两个符号连接:
$ln -s libhello.so.1.0 libhello.so.1
$ln -s libhello.so.1 libhello.so
这样一个libhello的动态连接库就生成了。最重要的是传gcc -shared 参数使其生成是动态库而不是普通执行程序。
-Wl 表示后面的参数也就是-soname,libhello.so.1直接传给连接器ld进行处理。实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是它正在运行的实际文件名,在程序执行期间,程序会查找拥有 soname名字的文件,%B

3. Linux下的静态链接库和动态链接库有什么区别

学习Linux动态链接库是一个绕不开的话题。动态链接库与静态链接库之间存在着显着的区别。静态链接库在编译链接时,将库文件的代码全部加入到可执行文件中,生成的文件较大,但运行时无需库文件。静态库后缀名为.a。相反,动态链接库在程序运行时才被载入内存,节省了资源,并解决了静态库在更新、部署和发布时的麻烦。动态库的后缀名为.so,gcc/g++在编译时默认使用动态库。

通过生成动态库的步骤,可以了解如何将多个文件编译成一个动态库。创建一个头文件和三个.cpp文件,然后将这几个文件编译成动态库libdynamic.so。通过命令行参数,-shared和-fPIC选项来生成动态链接库。在调用动态链接库时,使用链接命令来创建可执行文件,参数-L和-ldynamic用于查找库文件。

在测试链接时,可能会遇到ld提示找不到库文件的问题。解决方法之一是编辑/etc/ld.so.conf文件,添加库文件所在目录,并通过ldconfig更新缓存文件。静态库的编译过程同样重要,通过ar命令创建静态库文件,并使用nm命令查看文件内容。

动态链接库的优点在于进程间的资源共享,可以避免重复加载相同库函数,大大节省了系统的内存资源。C的标准库就是动态链接库,使得系统中所有运行的程序共享同一代码段。在编写程序时,可以选择何时链接动态链接库函数,根据需求进行加载,从而节省系统资源。

动态链接库在程序运行过程中根据需要加载特定功能,避免了一次性加载所有可能用到的函数,降低了内存占用。例如,在处理不同文件类型时,只在确定文件类型后才加载相应的读写函数,避免了未使用的函数占用内存。

总之,动态链接库和静态链接库在编译和运行时具有不同的特点和优势。选择何时使用动态链接库取决于具体应用需求和资源优化目标。理解两者之间的区别有助于更有效地利用资源,提高程序性能。

4. 配置Linux内核的时候,驱动的静态编译和动态编译有什么区别

驱动的动态编译会生成.ko文件,系统启动后需要加载该驱动后才能使用相应设备。
而静态编译则直接编译进内核,系统启动的时候会自动加载该驱动。
静态编译太多驱动至内核,会导致内核体积过大,启动时间较长。而动态编译则比较自由灵活,需要用的时候即加载,不需要的时候即卸载。我以前在EasyARM-iMX280的学习手册里看到写得很清楚,你可以去看看的。

热点内容
linux分割行 发布:2024-11-24 22:11:02 浏览:576
获取ftp文件 发布:2024-11-24 21:54:20 浏览:520
资源平滑算法 发布:2024-11-24 21:54:18 浏览:57
vs和vc编译器哪个好使 发布:2024-11-24 21:54:07 浏览:804
爱课程适用于什么安卓系统 发布:2024-11-24 21:54:02 浏览:38
51单片机编译 发布:2024-11-24 21:50:05 浏览:366
android常用的工具类 发布:2024-11-24 21:42:25 浏览:48
用户管理源码 发布:2024-11-24 21:29:36 浏览:677
监控怎么配置路由器 发布:2024-11-24 21:29:27 浏览:455
小型编译器的实现 发布:2024-11-24 21:27:48 浏览:999