C ++ - 如何内联驻留在.lib中的函数?

时间:2013-12-19 15:49:32

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

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

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

e.g。

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
}

4 个答案:

答案 0 :(得分:2)

要从对象(或库)文件内联函数,您需要使用link-time optimization (LTO)编译此对象文件。有关详细信息,请参阅Inlining functions from object files

答案 1 :(得分:1)

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

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

  1. 给他们一个不同的名字。
  2. 将函数放入命名空间。
  3. 为这些功能添加不同的签名。
  4. static仅在给定的翻译单元中显示它们。

答案 2 :(得分:1)

最简单的方法是给函数命名不同的名称。

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

如何使用include和lib路径取决于您的工具链。

答案 3 :(得分:0)

编辑回应Sam Cristall的评论。

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

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

如果您的意思是“在链接时内联”(“内联”一词的不幸重载),请参阅其他答案