Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;使用O1优化时发生链接器错误_C++_Gcc_Linker_Compiler Optimization - Fatal编程技术网

C++ C++;使用O1优化时发生链接器错误

C++ C++;使用O1优化时发生链接器错误,c++,gcc,linker,compiler-optimization,C++,Gcc,Linker,Compiler Optimization,在一个已经存在且相当大的项目中,我正在启用gcc编译器优化O1 没有这个选项,一切都可以正常构建、链接和运行。 启用该选项后,主可执行文件将编译并链接,但在链接其中一个单元测试时,我会收到链接器错误 在这两次编译运行之间,我没有更改任何代码或生成文件,只有O1优化标志 我得到的错误是: Configuration.a(Builder.o): In function `Builder::Create() const': Builder.cpp:123: undefined reference to

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

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

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

我得到的错误是:

Configuration.a(Builder.o): In function `Builder::Create() const':
Builder.cpp:123: undefined reference to `Factory::Instance()'
在链接过程中的某个地方,它遇到了
Builder.cpp
的这一行(第123行): cpp文件

(除了
实例
函数的链接器错误外,我还从
CreateObject
函数中得到了一个错误)

当我查看
工厂时
,我看到: 头文件

class Factory { public:
    static Factory* Instance(); << rest of the file >>
首先,我尝试了一次清洁和重建,但没有任何效果。 我还使用nm转储了
Factory.o
(一个有优化,一个没有优化)的已用符号,并对它们进行了比较

我看到一些符号被删除了,但没有删除
Factory::Instance()。我确实看到这个函数的地址发生了变化,但我不认为这是个问题

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

有人知道如何发现这个问题吗

Configuration.a(Builder.o):在函数
Builder::Create()const'中:
Builder.cpp:123:对
Factory::Instance()的未定义引用

既然您已经验证了
Factory::Instance()
是在
Factory.o
中定义的,而且您显然在使用存档库,那么我的水晶球说,包含
Factory.o
的任何库都在
配置.a
之前的命令行上,而它应该在它之后


命令行上存档库的顺序。

编译器版本?如何编译它(makefile是否足够短,可以发布?)?您是否确保这是您更改的唯一内容(即,如果您将
-O1
取出,它是否会重新编译)?除了缺少线程安全性和误导性的命名(
Factory
实际上有点像单例),我在您显示的代码中没有看到任何令人反感的内容。如果
-O1
确实是您更改的唯一内容,那么它应该可以正常工作。除非makefile中有一个条件子句在启用优化时不编译
factory.cpp
或其他东西,但这有点荒谬(可以排除这一点!)。
class Factory { public:
    static Factory* Instance(); << rest of the file >>
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; }