我们在编译开源代码后,通常会生成.a和.so这两个库文件,这两个文件有什么区别?又如何使用?
在 Linux 中,.a
和 .so
文件都是库文件,但它们有一些区别:
静态库文件(.a):
.o
文件)的集合。这些目标文件被打包成一个单独的文件,以便在链接时使用。共享库文件(.so):
在编译时,通过 -l
选项指定要链接的静态库文件,例如 -lmylib
表示链接 libmylib.a
静态库文件。
静态库文件通常在编译时直接链接到可执行文件中,因此不需要在运行时担心库文件的位置。
在编译时,通过 -l
选项指定要链接的共享库文件,例如 -lmylib
表示链接 libmylib.so
共享库文件。
在运行时,程序需要知道共享库文件的位置。可以通过以下几种方式之一实现:
/usr/lib
、/usr/local/lib
等。LD_LIBRARY_PATH
环境变量中,例如 export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH
。ldconfig
或 LD_PRELOAD
等机制来指定共享库文件的位置。主要区别在于静态库文件的代码在编译时被复制到可执行文件中,而共享库文件的代码在运行时由操作系统动态加载。这导致了静态库文件的可执行文件会更大,而共享库文件的可执行文件则会更小。
静态库文件使得可执行文件与库文件完全独立,但也导致了可执行文件的体积较大。而共享库文件可以被多个程序共享,因此节省了磁盘空间,并且使得系统中的程序能够共享相同的库,但会增加对库文件位置的依赖。