【问题标题】:C++ - how can I inline a function that resides in a .lib?C++ - 如何内联驻留在 .lib 中的函数?
【发布时间】:2013-12-19 15:49:31
【问题描述】:

据我所知,不可能在 lib 文件中将函数声明为“内联”并将该函数“神奇地内联”到另一个项目的调用者函数中(因为链接与编译不同,后者之前发生过)。

当多个函数(在多个库中)具有相同声明但定义不同时,我如何内联函数?

例如

obj1.lib

void function1() { printf("Hi"); }

obj2.lib

void function1() {printf("whatsup?"); }

main.cpp

void function1();

int main()
{
  function1(); // I'd like to be able to inline this, I can steer the linking against obj1 or obj2, but I can't inline this one
}

【问题讨论】:

  • 你的意思是内联优化意义上的吗?您需要打开链接时间优化,在 GCC 中是 -flto,MSVC++ 称为全程序优化。这不能保证内联,但至少可以实现。

标签: c++ compilation linker static-libraries inline


【解决方案1】:

要从对象(或库)文件内联函数,您需要使用 link-time optimization (LTO) 编译此对象文件。详情请见Inlining functions from object files

【讨论】:

    【解决方案2】:

    即使您内联函数,它们也必须始终具有相同的定义:在 C++ 程序中对同一实体有不同的定义违反了 3.2 中指定的单一定义规则 (ODR) [基本.def.odr]。 ODR 违规通常不会被编译器和链接器检测到,并且往往会导致相当奇怪的问题。

    您需要确保功能不同,例如,使用以下技术之一:

    1. 给他们一个不同的名字。
    2. 将函数放入命名空间。
    3. 为函数赋予不同的签名。
    4. static 设为仅在给定翻译单元中可见。

    【讨论】:

      【解决方案3】:

      您可以做的最简单的方法是为函数指定不同的名称。

      如果您希望内置选择具有给定名称、具有 2 个或更多不同实现的函数,并且您希望支持该函数的机器代码内联,则将其声明为 inline,这还需要提供每个变体头文件中的实现,并使用 include 和 lib 路径来选择相关的头文件(用于编译)和 lib(用于链接)——它们最好匹配。与任何inline 函数一样,这不能保证机器代码内联。关于机器代码内联inline 只是一个提示(它的保证效果是允许在每个翻译单元中进行定义,并要求在使用它的每个翻译单元中进行这样的定义)。

      如何使用包含路径和库路径取决于您的工具链。

      【讨论】:

        【解决方案4】:

        根据 Sam Cristall 的评论进行了编辑。

        如果您的意思是“编译时内联”,那么:

        为了使用库,您需要包含与该库关联的头文件。如果所需的函数在该头文件中声明为内联并且函数定义(函数的主体)可用,则编译器将(自行决定)内联该函数。否则不会。

        如果您的意思是“链接时内联”(不幸的是“内联”这个词的重载)而不是查看其他答案

        【讨论】:

        • 有时感觉需要围绕内联歧义进行一些语言开发。每周有几个问题将 C++ 定义意义上的“内联”和 LTO 意义上的“内联”混为一谈。
        • 啊——我不熟悉“内联”这个词的重载。这似乎是一个不幸的选择,但谷歌确实找到了这两种用法。谢谢你指出这一点,山姆。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多