解析Linux动态库与静态链接的差异(linux动态库静态链接)
Linux动态库和静态链接这两种情况都可以在Linux上编译和链接,但它们之间存在明显的区别。
一般地说,动态库文件的扩展名为 .so,静态库文件的扩展名为 .a。最重要的差异是,当动态库文件被链接到可执行文件时,它们只是可以在程序运行时按需要加载。而静态库文件将包含编译好的函数代码,因此在可执行文件中它们是必须的,即使其中的函数没有被调用。这就意味着,动态库文件可以减小可执行文件的大小,而静态库文件则会增加可执行文件的大小。
此外,在系统中使用动态库时,只有一个实例,所有使用此动态库的程序都指向同一份动态库文件,因此,如果动态库发生变化,所有使用此动态库的程序都会发生变化。而有的静态库文件则会被复制到每个可执行文件中,因此更新静态库时,必须重新编译每个可执行文件。
另外,Linux上的动态库可以使用dlopen ()函数使其动态加载,如下所示:
#include
void* lib_handle;char *error;
lib_handle = dlopen ("libmylib.so", RTLD_LAZY);if (!lib_handle) {
fputs (dlerror(), stderr); exit(1);
}
上面的代码会将动态库文件 libmylib.so 以 lazy 模式加载到当前进程中,当发生任何未解决的符号时,才会由系统解决。这使得动态库可以在运行时被动态加载,而无需在编译时就将其加载到可执行文件中。而静态链接库则无法使用dlopen ()函数动态加载。
总之,Linux动态库和静态链接库之间存在明显的差异:动态库可以延迟链接,可以缩小可执行文件,而静态库文件将包含编译好的函数代码,且不能使用dlopen ()函数动态加载。