我正在使用 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 之后,编译器应该在文件“ctest1.cpp”中内联函数调用 ctest2()(甚至在“in_test.cpp”中调用 ctest1()),但它没有吨。以下是我遵循的编译步骤:
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 和反馈)的情况下尝试此实验时,编译器会内联函数调用。在这种情况下,我只需从所有文件中创建一个可执行文件。这就是我期望它在静态库的情况下工作的原因。有人可以告诉我这里出了什么问题吗?