在一个已经存在且非常大的项目中,我启用了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()
符号。我确实看到有关此功能的地址已更改,但我不希望这是一个问题。
同样通过谷歌,我发现了一些可能性,但我找不到与我的问题相符的东西。
有没有人知道如何找到这个问题?
答案 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上的归档库的顺序。