Почему GCC не может встроить функции с -flto и оптимизировать профиль в статической библиотеке?

Я использую 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");
}

Заголовочный файл "ctest2.h" есть,

void ctest2();

И аналогично файл "ctest1.h",

void ctest1();

Эта статическая библиотека связана со следующим основным файлом "in_test.cpp",

in_test.cpp

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

using namespace std;

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

Я ожидал, что после предоставления правильной обратной связи и включения -flto компилятор должен был встроить вызов функции ctest2() в файле "ctest1.cpp"(и даже вызвать ctest1() в "in_test.cpp"), но это не так. т. Ниже приведены шаги компиляции, которые я выполняю:

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 ответов

Другие вопросы по тегам