【问题标题】:C++/CLI with OpenCL in Visual Studio 10Visual Studio 10 中带有 OpenCL 的 C++/CLI
【发布时间】:2012-03-14 03:52:12
【问题描述】:

首先我想说我对 openCL 比较陌生,对 C++ 有点生疏。这也是我第一次提出问题,所以请随时纠正我或指出我可以在帖子中改进的地方。

我有兴趣创建一个项目,该项目将创建混合模式程序集 dll(CLR 库项目)以供 CLR 表单应用程序加载和使用。 DLL 正在导入 openCL 静态库 c++ 头文件(本机代码)并使用托管包装类将其公开给 CLR。​​

但是我不断陷入致命错误 C1001 的陷阱,这真的没什么好经历的。

1>C:\Program Files (x86)\AMD APP\include\cl\cl.hpp(1270): warning C4290: C++ exception      specification ignored except to indicate a function is not __declspec(nothrow)
1>C:\Program Files (x86)\AMD APP\include\cl\cl.hpp(3708): fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'msc1.cpp', line 1420)
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++ 

哪个指向

cl_int enqueueNativeKernel(
void (CL_CALLBACK *userFptr)(void *),  

我正在使用 amd APP SDK v2.6 和 openCL 1.2 规范、Visual Studio 2010 Ultimate 并链接 SDK 提供的 header/lib。从理论上讲,从非托管代码到非托管代码的交叉应该不是问题,但因为它是用 /CLR 编译的,所以我包含了 #pragmas 以指示非托管传递无论如何

#pragma once
#pragma managed(push,off)
#define __NO_STD_STRING
#define __NO_STD_VECTOR
#include <cl\cl.hpp>

#pragma comment(lib,"OpenCL.lib")
#pragma managed(pop)

//rest of code

总是出现可怕的 C1001 错误和编译器崩溃(CL.exe 因为 c1xx.dll),无论我如何使用这些开关,我都束手无策。

开关如下 /CLR、/MDd、Optimization Disabled、EHa 用于异常处理。并且删除#defines 或任何包装代码不会改变任何事情,也不会删除#pragmas。

我应该注意到,使用包含的 C API (CL\cl.h) 可以很好地编译该项目,我知道我可以使用它来代替。

还有其他人遇到过这个问题吗?还是我做错了什么?我非常感谢有关此事的一些信息。

【问题讨论】:

  • 您可以尝试从没有/clr 编译的非托管代码中使用OpenCL,并将其与您的托管代码链接。最简单的方法是使用包含非托管代码的静态库,并使用项目依赖项将其拉入托管项目。
  • 可能相关:Target .NET 3.5 C++/CLI in Visual Studio 2010 Beta 2 特别是,请遵循建议从您的项目中清除所有临时文件,并确保您的目标是正确版本的 .NET Framework。另请参阅:C1001 - Compiler crash on C++/CLI project in VS2010 when target framework is 3.5
  • @CodyGray 我试过了,但是没有任何变化。而且我总是确保它实际上是针对 net 4.0。这个问题很容易重现。谢谢你的建议:)
  • @BenVoigt 实际上我会试一试。谢谢你的建议:)
  • @BenVoigt - 对于它的价值,这就是我为解决这个问题所做的。

标签: c++ visual-studio-2010 dll c++-cli opencl


【解决方案1】:

内部编译器错误意味着您的编译器崩溃。它没有在您的代码中发现错误;编译器本身损坏。这是由于编译器中的错误造成的,但如果您的代码错误,那么这可能有助于触发错误。

由于本例中的“你的代码”并不是真正的你的代码,而是 OpenCL 的代码,可能只是它不能被 C++/CLI 编译器编译。

【讨论】:

  • 这可能是真的。我对此也有类似的想法。也许我应该澄清一下,我想知道是否有人以前见过,并且知道导致编译器崩溃的 c++ 头文件到底出了什么问题。由于纯 C API 没有任何问题,我想知道是否可以使用我错过或不知道的预处理器指令来解决它。无论如何,标头都是开源的,因此任何人都可以查看它。无论如何感谢您的帮助 :) 让我想知道微软是否会有更好的答案。
猜你喜欢
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多