4

我正在使用 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 和反馈)的情况下尝试此实验时,编译器会内联函数调用。在这种情况下,我只需从所有文件中创建一个可执行文件。这就是我期望它在静态库的情况下工作的原因。有人可以告诉我这里出了什么问题吗?

4

0 回答 0