gpt4 book ai didi

c++ - LIB 不需要额外的依赖关系,但 DLL 需要

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:48 24 4
gpt4 key购买 nike

我有一个框架(用 C++ 编写)依赖于一些第三方库。当我编译一个静态版本的 library 框架时,不需要额外的依赖,也就是不需要第三方库的lib文件。当我将相同的框架编译为 DLL 时,现在需要额外的依赖项,否则我会出现链接错误。我可以猜到为什么会这样,但想要一个具体的答案/解释来理解正在发生的事情。

编辑: 澄清一下,我正在开发一个可以编译为 libdll 的框架然后用于一个(n)(可执行)项目。将框架编译为 lib 并使用第三方库中的函数时,我不需要额外的依赖项。但是,现在使用 lib 文件(即框架)的项目必须包含第 3 方 lib 文件。当我将框架编译为 dll 时,它会给我链接错误,除非我指定框架在技术上依赖的第 3 部分库。例如:我有几个从 Ogre3D 中调用功能的类。这些类被编译为 lib 文件。在编译类的 lib 时,我不需要链接到 OgreMain.lib。另一方面,当我编译相同类的 dll 版本时,我现在需要链接到 OgreMain.lib

最佳答案

当您有一个静态库(.lib 文件)时,它只是一个或多个目标文件 (.obj) 的集合,链接器只是将该代码添加到您的一个可执行文件中。您可以通过命令行开关、IDE 配置设置或什至 #pragma 告诉链接器执行此操作(具体取决于您的环境和编译器)。

当您在 DLL 中链接时,您需要为链接器提供一些代码,以便在您调用其中一个 DLL 函数时调用。通常,这是使用与 .dll 同名的文件来完成的,只是它是一个 .lib。该 .lib 中的代码以与上述相同的方式链接到您的程序中,但是当您调用它时,它会加载 DLL(如果尚未加载),然后调用适当的函数。

还有其他方法可以处理 DLL 链接(例如,.def 文件或 .NET 中的 #using 语句),但这似乎就是您所说的。


回复您的问题说明:

问题是 .lib 不是最终产品。它只是目标代码的集合,稍后当链接器将所有函数调用连接到函数地址时使用。

另一方面,DLL 是最终产品,因此链接器要求所有函数和变量都连接到实际地址。

我说的有点不准确,但你明白了。

关于c++ - LIB 不需要额外的依赖关系,但 DLL 需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3691454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com