1. 什么叫静态库和动态库
静态库是在编译时链接到程序中的库,而动态库是在运行时加载的库。
静态库: 定义:是二进制文件的一个集合,包含了程序运行所需的一系列函数和数据。 链接方式:在编译时会被直接嵌入到最终生成的可执行文件中。 优点:程序运行时不需要再加载额外的库文件,运行速度快,具有很好的可移植性。 缺点:程序体积相对较大,如果多个程序使用相同的静态库,会导致存储空间浪费。
动态库: 定义:是一种在程序运行时由操作系统动态加载的库。 链接方式:不会在编译时被嵌入到可执行文件中,而是在程序运行时加载。 优点:可以被多个程序共享使用,节省存储空间;程序启动更快,响应更快。 缺点:开发时需要处理复杂的依赖关系,在不同操作系统上需要不同的动态链接机制;程序的可移植性相对较差;程序调试和错误排查可能更复杂。
2. linux下使用nm指令查看静态库/动态库编译内容
在Linux环境下,当你遇到链接库问题时,深入理解库的编译内容变得尤为重要。这时,nm指令就成为一个有效的工具,帮助我们揭示静态库和动态库内的编译细节。
首先,对于静态库,我们可以使用命令
nm -g libname.a
执行后,如图所示,它会列出静态库中的全局变量和函数接口,让你清晰地看到库的内部结构。
而对于动态库,其查看方式为
nm -g libname.so
同样会显示出动态库的编译内容,包括函数和符号,这对于定位和修复与库相关的bug时非常有用。
因此,在链接第三方库或处理bug时,记得利用nm指令来记录和分析库的编译内容,它能提供宝贵的线索和信息。