首页 > 解决方案 > GCC 可以从静态库中内联函数吗?

问题描述

我正在制作一个可以从内联函数中受益匪浅的库,但它相当大,我决定将它编译为静态库,而不仅仅是预编译的头文件。在使用该库的代码中,如何使 GCC 从静态库中内联代码(粘贴在调用代码中,而不是链接和调用它)(这甚至可能)?

标签: c++gcc

解决方案


是的,在启用链接时优化的情况下,现代 C++ 工具链能够内联函数,即使它们不是内联函数(并且在调用发生的翻译单元中不知道它们的定义)。在 GCC 中,您可以通过-flto选项。基本上,这些通常的工作方式是编译器在编译您的源代码时,不仅会直接发出目标代码,还会将代码的内部表示写入目标文件。链接时,编译器不会简单地链接目标代码,而是基本上重新运行整个程序的内部表示的代码生成,就好像它是写在一个大源文件中一样。这会大大增加构建程序所需的时间。但它允许一些重要的优化,例如内联甚至跨翻译单元边界发生......

静态库只是目标文件的存档,因此如果您在启用 LTO 的情况下构建库并将调用代码链接到它,编译器将能够将函数直接内联到调用代码中。请注意,归根结底,是否内联仍由编译器决定,因此不能保证函数一定会内联……</p>


推荐阅读