为什么GCC无法在静态库中使用-flto和配置文件引导优化来内联函数?

时间:2015-04-24 11:25:11

标签: c++ gcc pgo

我使用的是GCC 4.7.2版。我创建了一个包含两个文件的静态库" ctest1.cpp"和" ctest2.cpp"。

ctest1.cpp

#include <stdio.h>
#include "ctest2.h"
void ctest1()
{
        printf("In ctest1");
        ctest2();
}

ctest2.cpp

#include <stdio.h>
void ctest2()
{
        printf("In ctest2");
}

头文件&#34; ctest2.h&#34;是,

void ctest2();

类似文件&#34; ctest1.h&#34;,

void ctest1();

此静态库链接到以下主文件&#34; in_test.cpp&#34;,

in_test.cpp

#include <stdio.h>
#include "ctest1.h"

using namespace std;

int main()
{
   ctest1();
   printf("InMain\n");
   return 0;
}

我期待在提供适当的反馈并启用-flto之后,编译器应该在文件&#34; ctest1.cpp&#34;中内联函数调用ctest2()(甚至在&#34中调用ctest1() ; in_test.cpp&#34;),但它没有。以下是我遵循的编译步骤:

g++ -Wall -c -g -O3 -fprofile-generate -ftest-coverage ctest2.cpp ctest1.cpp
ar -rcsv libtest.a ctest2.o ctest1.o
g++ -Wall -g -O3 -fprofile-generate -ftest-coverage in_test.cpp -o checking libtest.a

对于训练我运行可执行文件n次,然后

g++ -Wall -c -g -O3 -flto -fwhole-program -fprofile-use ctest2.cpp ctest1.cpp
ar -rcsv libtest.a ctest2.o ctest1.o
g++ -Wall -g -O3 -flto -fwhole-program -fprofile-use in_test.cpp -o checking libtest.a

我还尝试了-fuse-linker-plugin,其中我在编译命令中给出了黄金链接器的路径,但函数没有内联。我还想提醒您,当我在没有创建静态库(带有flto和反馈)的情况下尝试此实验时,编译器会内联函数调用。在这种情况下,我只是从所有文件中创建一个可执行文件。这就是我期望它在静态库的情况下工作的原因。 有人可以告诉我这里出了什么问题吗?

0 个答案:

没有答案