在一个已经存在且相当大的项目中,我启用了 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()
。我确实看到有关此功能的地址发生了变化,但我不认为这是一个问题。
同样通过谷歌,我发现了一些可能性,但我找不到与我的问题相匹配的东西。
有谁知道如何找到这个问题?