使用O1优化时出现C ++链接器错误

时间:2013-03-20 16:53:09

标签: c++ gcc linker compiler-optimization

在一个已经存在且非常大的项目中,我启用了gcc编译器优化O1

如果没有此选项,一切都会构建,链接和运行正常。 启用该选项后,主可执行文件将编译并链接,但在链接其中一个单元测试时会出现链接器错误。

在这两次编译运行之间,我没有更改任何代码或创建文件,只有O1优化标志。

我得到的错误是:

Configuration.a(Builder.o): In function `Builder::Create() const':
Builder.cpp:123: undefined reference to `Factory::Instance()'

在链接过程中的某个地方遇到Builder.cpp的这一行(第123行): cpp文件

pObject = Factory::Instance()->CreateObject();

(除Instance函数的链接器错误外,我还从CreateObject函数得到一个

当我查看Factory时,我看到: 头文件

class Factory { public:
    static Factory* Instance(); << rest of the file >>

在cpp文件中

Factory* Factory::sInstance = 0;

Factory* Factory::Instance() {
    // Check if this is the first call
    if (sInstance == 0)
    {
        // Create only instance
        sInstance = new Factory();
    }

    // Address of the instance
    return sInstance; }

首先,我尝试了清洁和重建,但那并没有做任何事情。 我还使用nm来转储Factory.o的已使用符号(一个有一个,一个没有优化)并对它们进行比较。

我看到删除了一些符号,但没有删除Factory::Instance()符号。我确实看到有关此功能的地址已更改,但我不希望这是一个问题。

同样通过谷歌,我发现了一些可能性,但我找不到与我的问题相符的东西。

有没有人知道如何找到这个问题?

1 个答案:

答案 0 :(得分:1)

  

Configuration.a(Builder.o):在函数Builder::Create() const': Builder.cpp:123: undefined reference to Factory :: Instance()'

由于您已经确认Factory::Instance()中已定义Factory.o ,并且由于您显然正在使用归档库,因此我的水晶球表示无论哪个库包含{{1在 Factory.o之前在命令行上,而在之后它应该是

命令行matters上的归档库的顺序。