C++/CLI:错误 C1190:包含 'vcclr.h' 时出现“需要/clr”选项
C++/CLI: Error C1190: ''/clr' option required' occurs when including 'vcclr.h'
我有一个 C++/CLI 库,它将被 WPF 应用程序使用。在这个库中,我试图将托管类型传递给仅接受 LPARAM
参数的非托管函数。我尝试使用 gcroot
来实现这一点。包含 gcroot.h
会引发更多编译器错误,因此我包含 vcclr.h
。
问题是,一旦我包含 vcclr.h
header,编译器就会抛出以下错误:
fatal error C1190: Managed code requires a '/clr' option
但是在我的项目属性中,我已经在 Project properties -> General
和 Project properties -> C/C++ -> General
下为配置('Debug' 和 'Release')和所有平台('Win32' 和 'x64').
错误发生在vcclr.h
的下面一行:
#using <mscorlib.dll>
例如在 DLL 的主 cpp 文件中写入相同的行似乎不会导致此错误。
我在项目中使用的平台工具集是Visual Studio 2017 (v141)
。
我知道关于此错误还有大约五个其他问题。但就我而言 none 的答案可以帮助我解决我的问题。这同样适用于关于 gcroot
.
的问题
这是一个棘手的问题。一般来说,如果你有 "way to much error messages" 然后选择过去的方式可能会在错误的一端减少混乱。
所以你的问题的答案。 如果您想使用 <gcroot.h>
,请不要使用 <vcclr.h>
,因为错误。最好 post 此处出错。
TLTR;尝试在包含之前使用 #ifdef _MANAGED
。这将避免任何其他编译单元读取未使用“/CLR”编译的代码。
如何调试较大项目中出现的大量错误?
肯定有更好的方法,但有时我会回去确保我确实理解我的编译错误。
- 找出哪个编译单元出错。
- 单独编译您拥有的每个 cpp 文件。 Right-click 在解决方案资源管理器中的文件上搜索并单击编译。
- 如果没有错误,不是这个文件。
好吧,你找到了那个坏的。
现在你会找到几个原因并根据那个选项:
- 您在包含之前使用了
#pragma manged(off)
。
该编译指示的 Microsoft 文档将其视为未定义行为。抱歉 :-/ ,我也是在微软 12 月更新 VS2017 后才知道的。
- 有一个文件需要
<thread> or <mutex>
而你做了 pimpl-ideom 但你确实有一个你无法用 /clr
编译的文件
好吧,重新开始,重构你的项目以不包含来自那些 un-managed 编译单元的 "managed" 头文件。
我有一个 C++/CLI 库,它将被 WPF 应用程序使用。在这个库中,我试图将托管类型传递给仅接受 LPARAM
参数的非托管函数。我尝试使用 gcroot
来实现这一点。包含 gcroot.h
会引发更多编译器错误,因此我包含 vcclr.h
。
问题是,一旦我包含 vcclr.h
header,编译器就会抛出以下错误:
fatal error C1190: Managed code requires a '/clr' option
但是在我的项目属性中,我已经在 Project properties -> General
和 Project properties -> C/C++ -> General
下为配置('Debug' 和 'Release')和所有平台('Win32' 和 'x64').
错误发生在vcclr.h
的下面一行:
#using <mscorlib.dll>
例如在 DLL 的主 cpp 文件中写入相同的行似乎不会导致此错误。
我在项目中使用的平台工具集是Visual Studio 2017 (v141)
。
我知道关于此错误还有大约五个其他问题。但就我而言 none 的答案可以帮助我解决我的问题。这同样适用于关于 gcroot
.
这是一个棘手的问题。一般来说,如果你有 "way to much error messages" 然后选择过去的方式可能会在错误的一端减少混乱。
所以你的问题的答案。 如果您想使用 <gcroot.h>
,请不要使用 <vcclr.h>
,因为错误。最好 post 此处出错。
TLTR;尝试在包含之前使用 #ifdef _MANAGED
。这将避免任何其他编译单元读取未使用“/CLR”编译的代码。
如何调试较大项目中出现的大量错误?
肯定有更好的方法,但有时我会回去确保我确实理解我的编译错误。
- 找出哪个编译单元出错。
- 单独编译您拥有的每个 cpp 文件。 Right-click 在解决方案资源管理器中的文件上搜索并单击编译。
- 如果没有错误,不是这个文件。
- 单独编译您拥有的每个 cpp 文件。 Right-click 在解决方案资源管理器中的文件上搜索并单击编译。
好吧,你找到了那个坏的。
现在你会找到几个原因并根据那个选项:
- 您在包含之前使用了
#pragma manged(off)
。 该编译指示的 Microsoft 文档将其视为未定义行为。抱歉 :-/ ,我也是在微软 12 月更新 VS2017 后才知道的。 - 有一个文件需要
<thread> or <mutex>
而你做了 pimpl-ideom 但你确实有一个你无法用/clr
编译的文件 好吧,重新开始,重构你的项目以不包含来自那些 un-managed 编译单元的 "managed" 头文件。