过度包含库 C++

Posted

技术标签:

【中文标题】过度包含库 C++【英文标题】:Overinclusion of libraries C++ 【发布时间】:2010-05-16 16:15:03 【问题描述】:

我正在阅读有关如何将 makefile 放在一起的信息,但似乎没有人提到如果您的文件需要不同的库集该怎么做,它们似乎都为每个文件使用相同的库集。由于每个文件似乎不太可能具有相同的库,因此我认为它们使用的列表必须合并整个项目所需的所有库。

我只是想知道包含太多库是否有任何缺点,或者编译器是否会找出需要哪些库并忽略其余库?

谢谢

【问题讨论】:

【参考方案1】:

如果包含太多库有什么缺点?

几乎没有。

如果编译器找出需要哪些而忽略其余的?

几乎完全正确:链接器检查每个库并仅提取它需要的目标代码。

包含大量库的一个缺点是很难按正确的顺序排列它们。最新版本的 GNU 链接器有一些特殊选项可以帮助解决库乱序问题(也是时候了),但这些选项仍然不可移植。另一方面,如果您包含实际上不需要的库,则它们的出现顺序无关紧要,因为链接器会仔细检查每个库并确定不需要其中的任何内容。

对于那些正在寻找项目的人来说,我很想拥有一个:给我一个工具,它可以获取库列表并对库间依赖项进行拓扑排序,然后告诉我我的命令可以把它们放在命令行上,这样就没有无缘无故未定义的符号了。

【讨论】:

谢谢,这很有帮助。不过有一件事——我从来没有遇到过关于图书馆秩序的任何事情。这是我应该特别关心的事情吗?如果是这样,我该如何确定正确的订单库包含内容? @wyatt,如果订单还没有咬到你,那就不用担心了。否则,唯一的规则是,如果 liba 依赖于 libb,则命令行必须有 -la -lb 而不是 -lb -la【参考方案2】:

链接器(获取通过编译源代码创建的所有.o 文件并将它们转换为可执行文件的工具)不会链接未调用到可执行文件中的代码。 IE。简单地说:

void foo()

 // code


void bar()

 // code


int main()

    foo();
    return 0;

这里foo的代码会被链接到可执行文件中,bar的代码不会。当然,假设这是整个程序。

如需更全面的解释,请阅读 answer I've given just an hour ago 到另一个问题。

【讨论】:

链接器在这类事情上非常聪明。

以上是关于过度包含库 C++的主要内容,如果未能解决你的问题,请参考以下文章

杂项讨论

将 c++ 库包含到 openCL 内核中?

CMake C++ 包含静态系统库到项目 - 如何

将非 Blittable 结构从 C# 编组到 C++

Boost 库无法在 C++ 中工作,包含目录不起作用

有条件地包含 C++ 标准库