c++ - 关于静态/隐式链接与动态/显式链接的误解
问题描述
我最近了解到静态链接和隐式链接基本上是同一件事,只是命名法不同。我的理解是,当您静态(隐式)链接到二进制文件时,根据定义链接到*.lib
(windows)或*.a
(linux)文件,通常target_link_libraries
在cmake中使用。另一方面,当您显式链接(LoadLibrary
在 Windows 上使用)时,您根据定义链接到*.dll
文件(或*.so
在 linux 上)(并且没有相应的 cmake 命令,因为所有工作都在实际代码中完成)。
但是,在多个地方,我读到有人提到静态/隐式链接到dll
文件,这让我感到困惑。很明显,我的知识在某个地方存在漏洞,我希望这里有人可以堵住它。
编辑
有人指出,这个问题主要是指窗户,它确实如此。但是,我目前正在尝试生成跨平台代码,因此我仍然对这些概念如何(或是否)推广到其他平台感兴趣。
解决方案
实际上有 3 种不同类型的链接,而不是 2 种。
对于 UNIX:
链接到归档(又名静态)库:
gcc main.o libfoo.a
链接到动态(又名共享)库:
gcc main.o libfoo.so
Link against
libdl
,它允许您dlopen
任意其他共享库(在链接时不需要存在):gcc main.o -ldl
2 和 3 都涉及动态链接器(并且正在使用共享库),但程度不同。
Windows 上存在等价物:当您链接到 时foo.lib
,您使用的是1 或 2,具体取决于是否foo.lib
包含实际代码或引用foo.dll
.
当您使用 时LoadLibrary
,您是第 3 种情况。
推荐阅读
- jquery - $(element).data('name', this) 在 jquery 的自定义扩展函数中是什么意思
- python - 为什么 super.__new__ 不需要参数但 instance.__new__ 需要?
- python - 如何根据主列表的值制作列表列表?
- wordpress - 将子域从数字海洋映射到博客的 wordpress
- android - 创建签名的 Android 映像后缺少内核 DTB
- javascript - 如何通过 React Native Bridge 替换 webkit javascript 接口
- c# - 拖动一些像素后,GridSplitter 卡住了
- android - Android 在运行时从 XML 获取视图值
- java - Spring + MongoDB - MongoTemplate + Criteria 查询
- python - 无法使用 python + h5py 访问外部链接