Linux动态库编程——掌握Linux系统下动态库开发的专业指南 (linux动态库方面的书)

动态库是Linux系统下最常用的代码共享方式之一。相对于静态链接库,动态库的运行时代码加载方式更为灵活,可以在程序运行时动态链接,降低了内存的浪费,提高了程序的执行效率。

本文将介绍Linux系统下动态库的基本概念、编写方法以及相关工具的使用。通过本文的学习,读者可以完全掌握Linux系统下动态库的开发方法,准确高效地使用动态库,为程序的开发提供更为灵活的代码组织方式。

一、动态库的基本概念

动态库是一种可执行代码的共享库,其规则和静态库类似,但是不同的是,动态库不是在编译时链接进可执行文件,而是在运行时动态加载。在Linux系统中,动态库的文件后缀为.so,即Shared Object。

动态库的主要作用是提高程序的代码重用性,并降低内存浪费。Linux系统中常用的动态库有两种:一种是共享对象,另一种是动态链接库。

共享对象是一种可以被加载和卸载的库,允许多个程序共享同一份代码,从而节省内存。共享对象一般会设定一个版本号,以保证程序兼容性。

动态链接库是一种在程序运行时才被加载的库,程序需要使用它时,才会在内存中进行链接。动态链接库的好处是可以避免在编译程序时依赖所有的库文件,从而降低程序的大小。

二、动态库的编写方法

编写动态库的方法与编写静态链接库类似,只不过编写的函数将被编译成.so文件。主要步骤如下:

1、编写代码文件

和静态库的编写方法类似,我们首先需要编写动态库所需的源代码文件。假设我们需要编写一个动态库libhello.so,其中包含一个函数print_hello(),打印出“Hello World!”的字符串。

我们可以通过以下方法来实现:

“`

// hello.c

#include

void print_hello() {

printf(“Hello World!\n”);

}

“`

2、编译生成动态库文件

我们可以通过gcc命令来生成.so文件:

“`

$ gcc -shared -o libhello.so hello.c

“`

其中,-shared选项表示编译生成的是动态库;-o选项指定输出文件名为libhello.so。

3、测试动态库

我们创建一个测试文件test.c,调用print_hello()函数:

“`

// test.c

void print_hello();

int mn() {

print_hello();

return 0;

}

“`

我们可以通过以下方式编译test.c文件:

“`

$ gcc -o test test.c -L. -lhello

“`

其中,-L选项指定动态库的搜索路径,点(.)表示当前路径。-l选项表示链接一个名为libhello.so的库。

我们运行test文件,即可看到打印出“Hello World!”的字符串。

三、动态库相关工具的使用

为了更好地理解动态库,我们需要了解一些工具的使用方法。

1、ldd

ldd命令用于显示可执行文件或动态库文件所依赖的共享库。我们可以通过以下方式使用ldd命令:

“`

$ ldd test

“`

输出结果如下:

“`

linux-vdso.so.1 => (0x00007ffcac5c9000)

libhello.so => ./libhello.so (0x00007f633e81d000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f633e448000)

/lib64/ld-linux-x86-64.so.2 (0x000055972f3fe000)

“`

其中,之一行是一个虚拟库地址,不是实际的库文件,它提供用于Linux系统调用的接口。其余有实际库文件路径。

2、nm

nm命令可以用来查看库中所包含的符号。我们可以通过以下方式使用nm命令:

“`

$ nm -D libhello.so

“`

输出结果如下:

“`

0000000000000669 T print_hello

“`

其中,符号“T”表示该函数为公共函数。

3、objdump

objdump是一个反汇编工具,可以查看共享库或可执行文件的汇编代码。我们可以通过以下方式使用objdump命令:

“`

$ objdump -D libhello.so

“`

输出结果类似如下:

“`

libhello.so: file format elf64-x86-64

Disassembly of section .init:

0000000000000538 :

538: 48 83 ec 08 sub $0x8,%rsp

53c: 48 8b 05 ae 0a 20 00 mov 0x200aae(%rip),%rax # 200ff0

543: 48 85 c0 test %rax,%rax

546: 74 02 je 54a

548: ff d0 callq *%rax

54a: 48 83 c4 08 add $0x8,%rsp

54e: c3 retq

Disassembly of section .text:

0000000000000550 :

550: 55 push %rbp

551: 48 89 e5 mov %rsp,%rbp

554: 48 8d 3d d3 00 00 00 lea 0xd3(%rip),%rdi # 628

55b: b8 00 00 00 00 mov $0x0,%eax

560: e8 ab fe ff ff callq 410

565: 90 nop

566: 5d pop %rbp

567: c3 retq

Disassembly of section .fini:

0000000000000590 :

590: 48 83 ec 08 sub $0x8,%rsp

594: 48 83 c4 08 add $0x8,%rsp

598: c3 retq

“`

四、动态库的使用注意事项

1、版本管理

由于动态库的多次共享,我们需要对动态库版本进行管理,并确保新版本不影响已有程序的运行。我们可以使用符号版本来定义函数的版本,从而保证程序向后兼容。

2、路径管理

动态库在运行时会被动态加载,如果动态库文件不能被程序找到,那么程序将无法执行。因此,我们需要合理设置库文件搜索路径,并将动态库文件拷贝到正确的路径下。

3、导出函数

与静态库类似,动态库文件也需要导出函数。我们可以使用export命令在动态库文件中导出函数,从而使得其他程序可以直接调用该函数。

“`bash

export print_hello

“`

相关问题拓展阅读:

如何让linux加载当前目录的动态库?

linux 加载当前目录的动态库的方法是:设置合适的环境变量LD_LIBRARY_PATH。\x0d\x0a设置方法有以下三种:\x0d\x0a\x0d\x0a1、临时修改,log out之后就失效\x0d\x0a在terminal中执行:export LD_LIBRARY_PATH=./\x0d\x0a\x0d\x0a2、让当前帐号以后都优先加载当前目录的动态库\x0d\x0a修改~/.bash_profile在文件末尾加上两尘或歼行:派冲 LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH \x0d\x0a\x0d\x0a3、让所有帐号从此都团粗优先加载当前目录的动态库\x0d\x0a修改/etc/profile在文件末尾加上两行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH

零基础学计算机编程有什么好的书籍推荐

下面这个可以参考一下,具体还要看个人的情况。

我觉得应该根据你的工作需要或者说你的发展方向而定。基本上两大类吧:C/C++和Java。比如,如果你要做企业级应用的你应该学习Java和C;如果你想做嵌入式,那么应该学好C语言;其他情况下,在你不知道要做什么之前你衡裤可以选择学习C/C++。学会这两大类中的一类,对于你学习其他语言都将是比较轻松,包括脚本语言,动态语言呵呵,这里想就自己的学习经历和情况给大家一个建议,仅供参考。

1、我的入门是从学习C语言开始的(其实课程是C++),这是我们学校的公共课,我上课比较认真(虽然老师讲得很差,而且一段时间后,我就发现自己的基础掌握比她好,当然理解深度没她好),因此,我认为对于完全没有基础的人而言,听别人讲比较容易入门。当时的教材是学校自己编的,挺烂的。

建议一(以C/C++为例),对于刚想进入编程的人(就是从来敏宏都没有接触过编程的人),更好是听课的方式(自己看的话估计要很慢,而且很痛苦),可以找视频或者培训等。C语言推荐入门教材:谭浩强的C语言,最新版是第三版,不过第二版应该也可以了(蓝色的)。说明一下:坚决不同意直接看K&R的《TheCprogramminglanguage》,这本书绝对不是初学者可以看懂的,里面讲语法的并不多,语法都是合在程序里面讲。不过这本书非常好,入门以后一定要看的一本书。

当然可以从C++直接入门,C++之父强烈推荐从C++直接入手。C++推荐入门教材:钱能的C++(红色的,清华大学出版),这本书之一版不是ISOC++,不过比较经典,作者现在也出了第二版了,第二版好像不是太好。国外的更好的入门教材据说是:《AccleratedC++》作者是Koenig和Moo夫妇,非常厉害。他们的著作还有《c陷阱与缺陷》《c++沉思录》。《AccleratedC++》这本入门的书我没有看过,我觉得还是先找本国内的书好好看,看的差不多了,国外的经典书籍随便看就会觉得很有味道,否则你可能会很受打击。入门的书至少要看两三遍(要彻底理解哦):)。如果是C++,我建议后面类的部分至少要理解三到五遍。说明一下,c++模板的部分可以先不用看,如果有兴趣的话,等把c++学的差不多了,我觉得可以把模板、STL、泛型编程结合起来学习,这个又是一个很大的工作量了,又得下很大的功夫。所以说,C++博大精深啊。

建议二、学习过程中要结合简单的算法,像冒泡还有类似c语言程序百例这样的小例子做做;更进一步应该做点大一点的项目,更好是控制台程序。或者你已经着手学习win32、MFC或linux,你也可以结合平台做点小的项目。

2、之一阶段是最苦的,接下来相对就知道应该怎么去学习了。这时候假设你已经有了扎实的c++基础。这是你可以选择也应该选择发展方向了,做企业级应用,还是系统开发,嵌入式设计或者游戏开发那时我其实并没有考虑那么多,咐拿简因为我不是学计算机的,因此我就把参加一些计算机之类的考试当作学习目标。我当时其实C++语言基础已经很不错了,但是上机实践很少(那时我没有电脑),因此参加省计算机二级,全国计算机三级和全国计算机四级考试,结果上机都没有通过。我很郁闷,二级的时候是我不知道怎么样进那个DOS界面把题目调出来,三级的时候是很快就编好了,也通过运行了,可是成绩出来却不及格,四级的时候是编好了,可能是我那题目比较难,好像用了两次循环,结果那破机器竟然承受不了。后来一乱就毁了(当然主要是上机太少了)。不过我那些上机都没有去补考。二级和三级的时候是自恃水平已经远远超过考试要求了,四级的时候则因为自己已经通过高级程序员考试,觉得补考上机好像没必要。(我高程和四级都是在2023年考的)。

建议三:定位学习方向,并好好学习计算机基础知识。在你还不确定学习方向,或者你还在大学本科期间,那么我认为应该先把计算机的基础知识好好学习一下。我认为计算机必学的基础课程而且要精学——首先是数据结构,其次是操作系统、软件工程,数据库。这四门课不管你将来想从事哪个方向的基本上都会用到。当然,有时间的话,其他基础课都是应该掌握的,离散数学、组成原理、体系结构、网络、编译原理甚至跨学科的。方向是很重要的,因为知识其实是无限的,一个小小的领域就够你研究很久了。本科生可能还没有什么方向的感觉,但是到了研究生你一定要清楚自己到底想要做什么,要往哪个方面发展,不要盲目学,瞎学乱学,否则最后可能看似什么都会,其实什么都不会。

我也曾经学习过Java一段时间,这篇文章既然是谈编程语言的入门学习,我也简单说一说。因为有了比较C++扎实的语言基础,所以Java学起来比较轻松。我先找了国内一本薄薄的教材很快看了一遍(几乎都理解,但是只看了一遍),空闲的时间配合清华张孝详老师的java视频。以后其实才算我真正要开始入门JAVA的学习,我用了是《corejava》中文第六版(本来想用候捷翻译的第二版的《ThinkinginJava》,发现被同学弄丢了),这本书我差不多用了20天才把里面的知识都搞懂,当然包括程序风格的模拟,最重要的时我把有关GUI编程的那三章里面的程序例子几乎可以默写出来(当然,那是因为我理解了,其实这样就变成了我的知识了),里面的API我也记得差不多了。(说明:Java里面的GUI编程没什么用处了,建议大家先跳过,GUI不是Java的长处,如果以后需要的话再查手册或者再记忆学习)。

其实学习了C++以后,学习Java是比较容易了,但是建议不要两种都学啦,他们的用途是不一样的,你应该熟悉其中一种,更重要的是熟悉其应用领域所需要的专业知识甚至平台,以及使用他们的企业,有创业计划的还应该考虑一下他们的应用领域,最重要的是思考他们的潜在的应用领域。

对于初级的学习就讲到这里,接下去的学习其实都是高级部分,先不介绍了,因为:一、我自己都还没有学懂,这里乱吹会误人子弟。二、高级东西的学习很多,有很多选择,又需要很多繁琐的知识,可能也一下子没办法讲清楚。

linux动态库方面的书的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux动态库方面的书,Linux动态库编程——掌握Linux系统下动态库开发的专业指南,如何让linux加载当前目录的动态库?,零基础学计算机编程有什么好的书籍推荐的信息别忘了在本站进行查找喔。


数据运维技术 » Linux动态库编程——掌握Linux系统下动态库开发的专业指南 (linux动态库方面的书)