在发布模式下进行编译时,我收到以下错误。
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&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。
有趣的是,重做似乎可以解决问题!
我想要实现的基本上是将NativeWindow的实际实现放在不同的文件中,主要是为了简单而不是重用性。
我想在继承中可能会混淆unique_ptr模板而不是那样做我也可以通过组合来做到这一点,并通过getter公开NativeWindow的实例,它可能工作但问题是,是否有更好的方法来做到这一点?
我很长一段时间没有重新学习C ++,所以如果我做的一些事情没有意义,请告诉我它!
更新
C ++标准说:
unique_ptr的模板参数T可能是不完整的类型。
我在Herb Sutter的blog中找到了一篇关于它的帖子。
答案 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, ®ional settings-> Region-> Administrative->Change system locale
并关闭 UTF-8。