gcc编译动态和静态链接库_静态和动态库

gcc编译动态和静态链接库

我认为静态库和动态库令人困惑。 让我们探讨一下为什么要首先解决创建库的麻烦。

首先,假设重用代码中的任何函数都是非法的。 这意味着每次要执行操作时,都必须每次都为其重写相同的功能。 幸运的是,这不是我们的现实,因为我们能够重用已经编写的功能。

尽管我们通常不想花时间来重用一个函数,但是通过库,我们可以存储我们知道稍后将要使用的代码。

例如,如果我们向库中添加了十个函数,则可以将该库包含在我们编写的下一个源代码文件中,并且可以访问这十个函数中的每一个。

在这里,我们将讨论两种不同的库-静态库和动态库。

在静态库中,链接器包括源代码使用的库函数的目标代码。 这意味着,如果您在源代码中创建了一个名为mylib.a的静态库,然后在mylib.a中定义了五个函数,则这些函数的实现将转换为目标代码,然后由链接器包含在最终的可执行文件中。

静态库比动态库更不容易被破坏。 这是因为一旦创建并使用了库中的可执行代码,该可执行代码在可执行文件中就很安全。 此外,由于这些功能已经被编译为目标代码并包含在可执行文件中,因此在静态库中对同一功能的多次调用将更快。

静态库的两个缺点是可执行文件大小和编译。 由于静态库中使用的功能的实际目标代码包含在最终的可执行文件中,因此静态库使可执行文件更长。 此外,对静态库中包含的函数实现所做的任何更改都不会反映出来,直到将静态库与新函数重新编译为止。

我们如何创建静态库?

让我们使用当前目录中的所有* .c文件创建一个静态库。 首先,我们需要将C文件编译为目标代码。 我们可以使用:

接下来,我们需要创建我们的静态库并向其中添加文件。 我们可以使用以下命令执行此操作:

在将所有内容添加到我们的标准库之后,需要对库进行索引。 可以通过运行命令ranlib libexample.a完成对该库的索引。 为库建立索引很重要,因为它可以在调用库时加快链接过程。

我们可以通过运行命令nm libstatic.a查看我们最近生成的索引。 Nm命令提供有关我们的静态库中符号的更多信息。 具体来说,默认情况下,nm命令将向我们显示符号的虚拟地址,符号名称以及有关符号类型的信息。 如果符号是小写字母,则是局部符号;如果是大写字母,则是外部符号。

要使用此静态库,我们将创建一个程序-将其命名为my_program.c,它使用了刚创建的库中的函数。 要使用库函数,我们需要告诉编译器在哪里看。 我们可以运行以下命令:

现在让我们看一下动态库。 让我们想象一个熟悉的场景,我们有一个源代码文件,该文件从mylib.so库中调用一个函数(注意文件扩展名的不同。在Linux上,静态库应以“ .a”结尾,动态库应以“ .a结尾”。所以”)。 链接程序不会将函数实现实际编译为目标代码并将其包含在可执行文件中,而是在动态库中,而是仅将我们尝试在可执行文件中使用的函数开始的地址包括在内。 这消除了由静态库引起的大小问题,因为最终的可执行文件将仅包含地址而不是整个函数实现。

此外,由于可执行文件具有指向该函数的指针而不是目标代码,因此您不必每次更改函数时都重新编译动态库。

我们如何创建动态库?

让我们使用当前目录中的所有* .c文件创建一个动态库。 首先,我们需要将C文件编译为目标代码,并使其位置独立。 我们可以使用:

接下来,我们需要创建动态库并向其中添加文件。 我们可以使用以下命令执行此操作:

将文件添加到动态库后,我们需要验证我们创建的共享库是否包含所有必要的依赖项。 我们可以通过运行以下命令来检查:

如果您的程序缺少依赖项,将显示“未找到”

该程序需要知道在哪里查找库文件。 因此,我们必须将动态库的位置添加到环境LD_LIBRARY_PATH中。 我们可以使用以下命令执行此操作:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

要使用此动态库(liball.so),我们将创建一个程序-我们将其称为my_program.c。 假设该程序使用了动态库中的函数。 然后,我们需要像处理静态库一样编译程序:

gcc -lliball -L。 my_program.c -o程序。

创建这个新的共享库之后,我们可以使用ldconfig命令创建到/etc/ld.so.conf目录的必要链接和缓存(供运行时链接程序ld.so使用 )。

因此,在决定为下一个项目使用静态还是动态库时,请记住一些权衡。 如果需要节省空间-可能应该使用动态库,如果需要更快的执行速度-则应该使用静态库。

翻译自: https://hackernoon.com/static-and-dynamic-libraries-fe5d23daffe3

gcc编译动态和静态链接库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值