在创建windows静态库时,我们只需创建一个应该包含在链接器路径中的.lib文件。
在创建windows共享库以及.dll时,我们还生成了一个.lib文件。这个lib文件包含由库公开的API的签名。
有两种使用此库的方法
我的问题是,对于Linux上的共享库,我们也有类似的东西吗?或者仅仅是静态库(.a)和共享库(.so)?
我知道如何使用gcc -l选项在linux上包含一个静态库。我们也可以使用相同的选项来包含一个动态库(.so)吗?
发布于 2014-11-19 12:10:51
我不能说我理解什么是“静态链接的动态库”,也不知道库中包含的签名(听起来很有趣:这是否意味着链接器能够检查参数中的类型不匹配,并在链接时返回类型?精灵绝对没有这样的功能。所以这个答案不是从比较的角度来回答的。此外,由于你的问题非常广泛,答案将是肤浅的细节。
是的,您可以创建静态库(.a)或共享库(.so)。当链接器查找-l请求的库时,如果两者都存在,它将更倾向于共享库,除非使用类似于-static的选项重写。
当使用源代码构建库时,只需要将其构建为静态库(.a)或共享库(.so),而不是两者兼而有之。不过,很多包的构建脚本都是为了构建这两个版本而设置的(这需要编译两次,一次使用独立位置的代码,一次不编译),以便让库的使用者选择链接哪个版本。
静态库的必要部分完全合并到构建的二进制文件中。不需要在运行时使用.a文件。相反,链接到二进制文件的共享库必须在运行时可用,尽管运行时动态链接器通常以修改后的名称搜索它,即"soname“(通常在链接时使用libsomething.so,在运行时使用libsomething.so.<integer> ),这是一种特性,允许在系统中同时安装不同API的多个不同版本的库。
在您的问题中,您还提到了在运行时显式加载动态库。这通常用于模块化应用程序或带有插件的应用程序。在这种情况下,所讨论的库(通常称为“模块”或“插件”)根本不与应用程序链接,构建时链接器对此一无所知。相反,应用程序开发人员必须编写代码来调用运行时动态链接器,并要求它通过文件名或完整路径名打开库。有时,要打开的模块的名称会在应用程序的配置文件中列出,或者还有一些其他的应用程序逻辑来决定哪些模块是需要的,哪些是不需要的。
https://unix.stackexchange.com/questions/168831
复制相似问题