23

"warning C4793: 'anonymous namespace'::CV_XADD' : function compiled as native"如果我的 C++ 项目使用 CLR 支持编译,我正在使用 OpenCV 库及其头文件之一 cxoperations.hpp 生成。我可以通过包围 OpenCV 标头来防止警告,如下所示:

#pragma managed(push,off)
#include <cv.h>
#pragma managed(pop)

但是实际使用 OpenCV 的项目并没有在 CLR 支持下编译,它是一个原生 C++ 静态库。确实具有 CLR 支持并在没有 pragma 语句的情况下生成此警告的项目仅使用此静态库。所以我对这个警告的创建有点惊讶,特别是考虑到整个静态库不是用 CLR 支持编译的,但只有这个头文件会导致问题。

因此,这个解决方案对我来说似乎不是最理想的。这是您处理此警告的方式,还是您可以推荐一个更好的做法?

4

3 回答 3

19

我想你想要的是这样的:

#pragma unmanaged
#include <cv.h>
#pragma managed
// managed code wrapping unmanaged opencv functions

C++/CLI 项目可以包含托管和非托管部分,编译器会为您处理这两者之间的数据编组。托管入口点将可以从普通的 .NET 应用程序(如 C# 和其他应用程序)调用,并将使用垃圾收集,并且它们将调用非托管函数来完成繁重的工作。

于 2010-05-06T22:20:24.213 回答
3

我认为你应该压制警告。MSDN文档明确指出,在包含语句之前不应使用托管/非托管编译指示。

#pragma warning(push)
#pragma warning(disable: 4793) // methods are compiled as native (clr warning)
#include <cv.h>
#pragma warning(pop)
于 2015-03-12T16:26:38.067 回答
0

如果您无法更改现有代码文件,则可以通过禁用对显示警告 4793的特定文件的 CLR 支持来消除该警告。当然,这仅在此文件不使用 CLR 功能时才有效。

要禁用对特定文件的 CLR 支持,请在解决方案资源管理器中找到它,右键单击并打开其属性页。将Common Language RunTime Support设置为No Common Language RunTime Support。不要忘记对All ConfigurationsAll Platforms执行此操作。

关闭每个文件的 CLR 支持

于 2015-11-23T16:48:25.017 回答