c语言编程笔录

首页 >   > 笔记大全

笔记大全

linux下静态链接库和动态链接库的区别有哪些

更新时间:2023-10-06

静态链接库和动态链接库的概念

静态链接库是一些函数和数据的集合,这些函数和数据可以被用于多个程序中,这些程序可以被编译成一个完全独立的可执行文件。动态链接库与静态链接库类似,但它们在程序的运行期间被动态加载到内存中。

静态链接库的特点和使用方法

静态链接库的特点是:一旦链接,其内容就被复制到了目标程序中,也就是说目标程序中运行的代码和数据都已经包含在了这个程序中。这样可以使得程序无需依赖外部文件,所有的代码都在一个文件中,方便程序的分发和交流。另外,由于所有的代码和数据都在一个文件中,所以程序的运行速度也会比较快。

下面是一个静态链接库的例子:

#include <iostream>
int main() {
    std::cout << "Hello, Static Library!" << std::endl;
    return 0;
}

本程序使用了标准库iostream。我们可以将该程序编译成一个目标文件,并将其链接到静态库中:

# 编译目标文件
g++ -c main.cpp
# 创建静态链接库
ar rcs libHello.a main.o

这里创建了一个名为libHello.a的静态链接库,并将main.o文件添加到其中。接下来我们可以编译一个使用该静态库的程序:

g++ main.o -L. -lHello -o hello-static    

该程序将会生成一个名为hello-static的可执行文件。

动态链接库的特点和使用方法

与静态链接库不同的是,动态链接库并不会被复制到目标程序中,而是在程序运行时加载到内存中。这样可以避免不同程序之间的代码重复,并且可以实现更好的程序代码共享。另外,在程序运行时,用户可以通过升级或替换动态链接库的方式来改变程序的行为。

下面是一个动态链接库的例子:

#include <iostream>
extern "C" {
    void sayHello() {
        std::cout << "Hello, Dynamic Library!" << std::endl;
    }
}

本程序中定义了一个函数sayHello。这个函数被声明为外部函数,并且可以在库之外被调用。我们可以将其编译成一个共享库并将其链接到我们要编译的程序中:

# 编译共享库
g++ -shared -fPIC -o libHello.so libHello.cpp
# 编译目标程序
g++ main.cpp -L. -lHello -o hello-dynamic   

这里创建了一个名为libHello.so的动态链接库,并将其链接到目标程序中。接下来我们可以编译一个使用该动态库的程序:

g++ main.cpp -L. -ldl -o hello-dynamic   

该程序将会生成一个名为hello-static的可执行文件。需要注意的是,由于动态库并不会被复制到目标程序中,所以我们需要使用ldd命令来查看程序的依赖关系:

ldd hello-dynamic

这个命令会输出程序所依赖的动态库信息。

总结

静态链接库和动态链接库各有其特点和优缺点。静态链接库可以使得程序独立运行,不依赖外部库文件,但生成的可执行文件比较大,代码重复,不利于程序的共享。动态链接库可以实现代码共享,减小程序体积,支持动态升级,但需要依赖外部库文件,程序的运行速度比较慢。

在实际工作中,我们需要根据实际情况选择使用静态链接库还是动态链接库来编写程序。有些程序需要独立运行,适合使用静态链接库;有些程序需要共享某些函数库,适合使用动态链接库。另外,我们也可以为程序提供不同版本的动态链接库,以满足用户不同的需求。