5

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

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

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

我得到的错误是:

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

在链接过程中的某个地方,它遇到以下行(第 123 行)Builder.cpp: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()。我确实看到有关此功能的地址发生了变化,但我不认为这是一个问题。

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

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

4

1 回答 1

1

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

由于您已经验证了Factory::Instance() 定义的内容Factory.o,并且由于您显然在使用存档库,因此我的水晶球说,任何库包含的任何库Factory.o都在命令行之前 Configuration.a,而它应该它之后。

命令行上存档库的顺序很重要

于 2013-03-22T03:45:25.443 回答