C ++致命错误C1001:编译器

时间:2016-03-15 07:43:45

标签: c++ unique-ptr c1001

在发布模式下进行编译时,我收到以下错误。

1>d:\users\eyal\projects\code\yalla\core\src\runbox\win32\window.cpp : fatal error C1001: An internal error has occurred in the compiler.
1>         (compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 249)
1>          To work around this problem, try simplifying or changing the program near the locations listed above.
1>         Please choose the Technical Support command on the Visual C++
1>          Help menu, or open the Technical Support help file for more information
1>           link!RaiseException()+0x48
1>           link!CxxThrowException()+0x65
1>           link!std::_Xout_of_range()+0x1f
1>           link!InvokeCompilerPass()+0x1b4e2
1>           link!InvokeCompilerPass()+0x22efe
1>           link!InvokeCompilerPass()+0x2332e
1>           link!InvokeCompilerPass()+0x232f9
1>           link!InvokeCompilerPass()+0x233cb
1>           link!InvokeCompilerPass()+0x22b04
1>           link!InvokeCompilerPass()+0x22d86
1>           link!DllGetC2Telemetry()+0x115837
1>
1>     1>
1>LINK : fatal error LNK1257: code generation failed

我正在使用VS2015 Update 2 RC。

我不确定,但也许它是优化器中的错误?

导致它的代码如下:

window.h中

class Window {
public:
    Window();
    ~Window();
    void show();
    void hide();
private:
    class NativeControl;
    std::unique_ptr<NativeControl> _window;
};

window.cpp

class Window::NativeControl : public NativeWindow {
public:
    NativeControl() : NativeWindow() { }
};

Window::Window()
    : _window(std::make_unique<Window::NativeControl>()) {
}

Window::~Window() {
}

void Window::show() 
{
    _window->show(WindowShowMode::Show);
}

void Window::hide()
{
    _window->show(WindowShowMode::Hide);
}

NativeWindow是任何操作系统的本机窗口。

以下是使用GCC 5.1编译的工作代码: https://ideone.com/4YvjRK

只是为了记笔记。

如果我删除继承并将其替换为类似的内容。

class Window::NativeControl {
public:
    void show(WindowShowMode showMode)
    {
    }
};

它会正常工作!

以下是使用GCC 5.1编译但没有继承的相同代码: https://ideone.com/Mu0A42

似乎导致此行为的原因是从NativeWindow派生NativeControl。

重现它的步骤如下:

  1. 从Window类中删除dtor声明和定义。
  2. 尝试构建(而不是重建)。
  3. 编译器会抱怨并给你一堆错误。
  4.   

    1&gt; C:\ Program Files(x86)\ Microsoft Visual Studio   14.0 \ VC \ include \ memory(1194):错误C2338:不能删除不完整类型1&gt; 1 GT; 1&gt; C:\ Program Files(x86)\ Microsoft Visual Studio   14.0 \ VC \ include \ memory(1195):警告C4150:删除指向不完整类型的指针&#39; Yalla :: Window :: NativeControl&#39 ;;没有破坏者叫     1 GT;
      d:\ Users \用户的Eyal \项目\代码\雅拉\芯\ SRC \ runbox \包括\ window.h中(13):   注意:请参阅Yalla :: Window :: NativeControl&#39;的声明。 1 GT;
      window.cpp 1&gt; 1&gt; Build FAILED。

    1. 将dtor添加回Window类。
    2. 再次构建(不是重建)。
    3. 此时编译器应该抱怨以下错误&#34;致命错误C1001:编译器中发生内部错误。&#34;
    4. 有趣的是,重做似乎可以解决问题!

      我想要实现的基本上是将NativeWindow的实际实现放在不同的文件中,主要是为了简单而不是重用性。

      我想在继承中可能会混淆unique_ptr模板而不是那样做我也可以通过组合来做到这一点,并通过getter公开NativeWindow的实例,它可能工作但问题是,是否有更好的方法来做到这一点?

      我很长一段时间没有重新学习C ++,所以如果我做的一些事情没有意义,请告诉我它!

      更新

      C ++标准说:

      unique_ptr的模板参数T可能是不完整的类型。

      我在Herb Sutter的blog中找到了一篇关于它的帖子。

4 个答案:

答案 0 :(得分:1)

与类似错误

(编译文件'f:\ dd \ vctools \ compiler \ utc \ src \ p2 \ main.c',第255行)

已固定更改Properties->Linker->Optimization->Link Time Code Generation/LTCG:incremental/LTCG

Studio 2015 Update 3

答案 1 :(得分:0)

在构建普通的C ++命令行应用程序并使用Microsoft Visual Studio社区 2019 ,版本 16.6.2 时,我遇到了类似的致命错误。

/LTCG:incremental配置中将/LTCG中的默认project -> properties -> linker -> optimization更改为release可以解决此问题。

只需添加,此错误在VS2019最近更新之一(不确定哪个特定更新)之后开始。

答案 2 :(得分:0)

我解决了此问题,以64位链接大型库。 Visual Studio尝试使用默认值(32位链接)。

Configuration Properties -> Advanced -> Preferred Build Tool Architecture -> 64-bit (x64)

答案 3 :(得分:0)

编译文件p0io.c相关的error C1001主要是由于启用了“Use Unicode UTF-8”来支持全球语言的Region Settings造成的。您可以查看有关具体原因的链接。你可以点击

Time &Language -> Region-> Additional date, time, &regional settings-> Region-> Administrative->Change system locale

并关闭 UTF-8。