Почему 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 и обратной связью), компилятор включает вызовы функций. В этом случае я просто создаю один исполняемый файл из всех файлов. По этой причине я ожидал, что это сработает в случае статических библиотек.
Может кто-нибудь сказать мне, что здесь происходит?

4

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]