【发布时间】: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