过度包含库 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++的主要内容,如果未能解决你的问题,请参考以下文章