gpt4 book ai didi

c++ - 我是否需要链接到一个我在当前库中没有使用其功能的外部库?

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

我有库A,其中的某些功能需要库B库 A 有两个独立的类 FG (即 FG 彼此不认识) 其中 G 在其 cpp 文件中包含来自 library B 的 header ,因此依赖于库 A库 B 上,因为 G 类。 F 使用库 B 中的任何功能。

我现在有一个使用 F G 的可执行文件 E。我是否需要链接到 library B,即使我没有使用 library A 中使用 library B 的任何功能?如果是,有没有办法避免这种情况而不将 library A 分成两个库?

我假设您不必链接外部库,除非您以某种方式使用它的功能。

最佳答案

不,这不是必需的。静态库是一种非常简单的文件格式,它只是一包 .obj 文件。链接器仅提取解决主程序中的依赖项所需的 .obj 文件。或者一个被拉入的 .obj 文件又需要使用另一个文件。只有在查看可用的 .obj 文件后符号仍未解析时,您才会收到链接器错误。

我尝试在 g.cpp 中仔细检查 G 类的示例实现:

#include "stdafx.h"
#include "a.h"

void foo(); // Defined in b.lib

G::G() {
foo();
}

并在如下所示的程序中进行测试:

#include "stdafx.h"
#include "..\a\a.h"


int main()
{
F obj;
//G obj2;
return 0;
}

它没有链接 b.lib 就很好地链接了。从 obj2 中删除注释会为 foo() 产生预期的 LNK2019 错误。


很多方法在实践中可能不会成功。很难用肉眼看到依赖关系。而链接的单位是目标文件,如上例中的g.obj。因此,将 F 类成员定义在与 G 类成员不同的源代码文件中非常重要。换句话说,您需要在 a.lib 中有一个单独的 f.obj 和 g.obj 文件。

这可以修补,/Gy 编译选项可以将各个函数打包在单独的部分中。这点亮了/OPT:REF 链接器选项,链接单元现在变成了一个单独的函数而不是目标文件。但这是一个相当高的代价,它只增加了可执行文件的最终大小,并没有消除仍然必须链接 b.lib 的需要。它会禁用增量链接,并且可能需要修改原始库项目。只要您需要这样做,将 F 和 G 的代码保存在单独的源文件中就更容易了。

链接器的/VERBOSE 选项可以提供洞察力,它向您显示正在引入什么以及哪个 .obj 文件导致依赖项被链接。在链接器 + 命令行、附加选项框中输入它。

关于c++ - 我是否需要链接到一个我在当前库中没有使用其功能的外部库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22671479/

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