首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unix/Linux环境中的动态链接类型

Unix/Linux环境中的动态链接类型
EN

Unix & Linux用户
提问于 2014-11-19 11:20:17
回答 1查看 966关注 0票数 2

在创建windows静态库时,我们只需创建一个应该包含在链接器路径中的.lib文件。

在创建windows共享库以及.dll时,我们还生成了一个.lib文件。这个lib文件包含由库公开的API的签名。

有两种使用此库的方法

  1. 我们可以直接引用项目中的库API,并在链接器属性中将路径添加到.lib文件中。有些人称它为静态链接动态库。
  2. 或者,我们可以在运行时显式加载动态库。在这种情况下,我们不需要为链接器指定lib文件路径。调用它动态链接的动态库。

我的问题是,对于Linux上的共享库,我们也有类似的东西吗?或者仅仅是静态库(.a)和共享库(.so)?

我知道如何使用gcc -l选项在linux上包含一个静态库。我们也可以使用相同的选项来包含一个动态库(.so)吗?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2014-11-19 12:10:51

我不能说我理解什么是“静态链接的动态库”,也不知道库中包含的签名(听起来很有趣:这是否意味着链接器能够检查参数中的类型不匹配,并在链接时返回类型?精灵绝对没有这样的功能。所以这个答案不是从比较的角度来回答的。此外,由于你的问题非常广泛,答案将是肤浅的细节。

是的,您可以创建静态库(.a)或共享库(.so)。当链接器查找-l请求的库时,如果两者都存在,它将更倾向于共享库,除非使用类似于-static的选项重写。

当使用源代码构建库时,只需要将其构建为静态库(.a)或共享库(.so),而不是两者兼而有之。不过,很多包的构建脚本都是为了构建这两个版本而设置的(这需要编译两次,一次使用独立位置的代码,一次不编译),以便让库的使用者选择链接哪个版本。

静态库的必要部分完全合并到构建的二进制文件中。不需要在运行时使用.a文件。相反,链接到二进制文件的共享库必须在运行时可用,尽管运行时动态链接器通常以修改后的名称搜索它,即"soname“(通常在链接时使用libsomething.so,在运行时使用libsomething.so.<integer> ),这是一种特性,允许在系统中同时安装不同API的多个不同版本的库。

在您的问题中,您还提到了在运行时显式加载动态库。这通常用于模块化应用程序或带有插件的应用程序。在这种情况下,所讨论的库(通常称为“模块”或“插件”)根本不与应用程序链接,构建时链接器对此一无所知。相反,应用程序开发人员必须编写代码来调用运行时动态链接器,并要求它通过文件名或完整路径名打开库。有时,要打开的模块的名称会在应用程序的配置文件中列出,或者还有一些其他的应用程序逻辑来决定哪些模块是需要的,哪些是不需要的。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/168831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档