静态库与动态库的区别! 天啊!

图书馆。 学分:建筑文摘

Linux中的与现实中的库起着相似的作用。

在Linux中,库是一个包含几个目标文件的文件,可以代替几个单独的目标文件使用。 就像现实中的库一样,Linux中的库通常会被索引,从而使从中检索信息更加容易。 伴随着此,由于要查找和打开的文件较少,因此库加快了编译的链接过程。 库的上述这些属性提供了对在程序中使用多个目标文件时使用库的好处的理解。

Linux系统使用户可以创建两种类型的库-静态库和共享(或动态)库。 让我们仔细看看每种类型的库。

静态库

静态库是在编译的最后阶段(链接阶段)链接到程序的存档文件。

使用静态库的第一步发生在编译过程中。 在此阶段中,将静态库的目标文件放入可执行文件中。

将程序编译成可执行文件后,用户可以通过在终端中输入文件名来执行文件。

共享/动态库

与静态库不同,动态库不是存档文件。 相反,它们的格式取决于要为其构建的体系结构。 结果,它们的链接和执行过程不同于静态库。

使用共享库的第一步也发生在编译过程中。 在此,链接器确认程序中的所有符号是否已链接到该程序或是否存在于共享库中。

重要的是要注意,链接器不会将动态库中的目标文件放入可执行文件中。 相反,仅对共享库的引用放置在可执行文件的内部。

第二步发生在运行时,当动态加载程序加载正在运行的程序所请求的共享库并将链接库链接到程序时。

静态库

首先,必须将将存储在静态库中的所有.c文件转换为目标文件。

  / *将所有c文件转换为目标文件* / 
$ gcc -c mycfile.c

存档程序用于创建静态库。 要创建静态库,请在终端程序中输入以下命令:

  $ ar -rc libmystatic.a * .o 

在此示例中,我们使用* .o来指定将当前目录的所有目标文件放入静态库中。 如果这不是您的意图,请确保在静态库中指定每个目标文件的名称。

-r标志用于请求用新的目标文件替换静态库中较旧的目标文件。

-c标志用于请求创建静态库(如果不存在)。

共享/动态库

创建共享库和静态库之间存在两个区别。

第一个区别来自链接动态库的第一步-目标文件未直接放置在可执行文件中。 结果,动态库的目标文件没有指示将它们放置在程序中的位置。 为了解决这个问题,所有跳转调用和子例程调用必须使用相对地址而不是绝对地址。 -fPIC标志可用于实现此目的。

  $ gcc -fPIC -c * .c 

通过使用此命令,我们创建使用相对地址而不是绝对地址的目标文件。 请注意,在为静态库编译目标文件时,我们不必使用此标志。

第二个区别在于共享库和静态库之间的本质差异。 静态库是一个存档文件,而共享库的格式取决于为其生成的体系结构。 为了指示应该创建共享库,可以使用-shared标志。

  $ gcc-共享的libmydynamic.so * .o 

遵循这些步骤后,将出现一个名为libmydynamic.so的共享库。

静态库

创建静态库或归档文件后,可以使用以下命令通过程序对其进行编译:

  / * gcc程序名称-options * / 
$ gcc main.c -L。 -静态

-L标志向链接器指示可以在给定目录中找到这些库。 在此示例中,由句点表示的当前目录是给定目录。

-l标志用于将库名添加到要提交给链接器的目标文件名列表中。 省略了“ lib”前缀和“ .a”后缀,因为链接器将在搜索文件之前自动附加名称的这些部分。

编译完程序后,可以通过输入编译过程产生的可执行文件的名称来运行程序。

  $ ./每年 

共享/动态库

通过使用以下命令,我们可以使用动态库编译程序:

  $ gcc main.o -L。  -动态-o 

像以前一样,“ lib”前缀和“ .so”后缀已删除,因为链接器会在搜索库之前自动附加这些部分。

使用此命令,链接器可以扫描共享库并验证没有符号丢失。

在尝试运行由该命令生成的可执行文件之前,我们必须通过修改LD_LIBRARY_PATH环境变量来指定动态加载程序应在哪些目录中查找共享库。 要查看当前状态下的LD_LIBRARY_PATH的值,我们可以键入以下命令:

  $ echo $ LD_LIBRARY_PATH 

如果包含共享库的目录不存在于LD_LIBRARY_PATH中的目录列表中,那么我们必须将目录追加到列表中。

 在这里导出LD_LIBRARY_PATH = /进入目录:$ LD_LIBRARY_PATH 
要么
setenv LD_LIBRARY_PATH /进入目录在这里:$ LD_LIBRARY_PATH

将必要的目录附加到LD_LIBRARY_PATH环境变量后,我们终于可以运行我们的程序了!

额外,额外,阅读所有有关它!

如果要验证系统的动态加载程序是否可以找到给定程序的共享库,则可以运行以下命令(其中filename是已与共享库链接的文件的名称):

  ldd文件名 

如果您有兴趣查看目标文件或库中的符号,则可以使用以下命令:

  nm文件 

静态库和动态库在减少编译的链接过程方面均具有优势。 两种类型的库之间的不同特征会带来多种好处和后果,在选择使用哪种类型的库之前必须考虑这些好处和后果。

静态库不需要动态加载器,使用静态库执行程序可能比使用动态库执行程序快。 除此之外,静态库可以更容易地集成到程序中。

动态库可以节省内存,这一优势可以大大超过静态库提供的任何优势。 由于多个程序可以使用共享库的同一副本,因此随时都只需要一个动态库在内存中的副本。

希望您可以在简要介绍了静态或动态库之后,开始将它们集成到您的程序中! 如果您有任何疑问或疑虑,请随时与我联系!

谢谢!

资料来源

与Linux上的GCC共享的库– Cprogramming.com

如何在Linux上的GCC / G ++中创建和使用共享库

www.cprogramming.com

构建和使用静态和共享的“ C”库

LUPG主页] [教程] [相关材料] [随笔] [项目构想] [发送评论] v1.0.1目录…

docencia.ac.upc.edu