C++ 使用Nvidia GPU计算工具包和Cygwin与Eclipse编译错误

C++ 使用Nvidia GPU计算工具包和Cygwin与Eclipse编译错误,c++,c,compiler-errors,opencl,C++,C,Compiler Errors,Opencl,我在Windows7x64上使用NVIDIAGPU计算工具包,并带有64位Cygwin包和Eclipse。(我使用内部构建工具,因为GNU make不喜欢Windows路径中的冒号。)我的代码: 下面是一段相当基本的代码: #包括 #包括 使用名称空间std int main() { cl_int error = 42; cl_platform_id platform; error = clGetPlatformIDs(1, &platform, NULL);

我在Windows7x64上使用NVIDIAGPU计算工具包,并带有64位Cygwin包和Eclipse。(我使用内部构建工具,因为GNU make不喜欢Windows路径中的冒号。)我的代码:

下面是一段相当基本的代码: #包括 #包括 使用名称空间std

int main() {
    cl_int error = 42;
    cl_platform_id platform;

    error = clGetPlatformIDs(1, &platform, NULL);

    return 0;
}
C++代码编译和运行都很好,我可以使用OpenCL头文件和
cl\u int
cl\u设备id
,但是使用
clGetPlatformID
我会得到以下编译错误:

relocation truncated to fit: R_X86_64_32 against symbol 
'__imp_clGetPlatformIDs' defined in .idata$5 section in 
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\lib
\x64/OpenCL.lib(OpenCL.dll.b)
我尝试了以下方法:

  • 卸载/重新安装Cygwin工具
  • 卸载和重新安装英伟达GPU计算工具包
  • 中的32位和64位库
  • 卸载/重新安装Eclipse并检查大多数设置
  • 通过添加“-mcmodel=medium”或“-mcmodel=large”避免32位内存限制。(根据搜索,有时32位和64位二进制文件是混合的。)
  • 确认我只使用64位Nvidia库和Cygwin工具

我的猜测是内部构建器应该受到责备,但使用它是导致构建失败的另一个问题的解决方案。

我有一点关于这方面的更新:

擦除并重新安装了几乎所有的东西(CUDA工具包、Cygwin、Eclipse),它仍然会给我同样的错误,即使有适当的标志(我在链接到一篇建议它的帖子之前使用过)

我所取得的进步是,我可能已经把重点放在了问题的实际所在。使用相对路径解决了GNU make无法处理路径中冒号的问题。这基本上清除了Eclipse内部构建器。然而,我在另一台机器上使用了几乎完全相同的设置,不同之处在于此设置有一个AMD卡,因此使用AMD应用程序SDK,而不是Nvidia的OpenCL工具包

我怀疑这可能是最近发布的CUDA toolkit 6.0版带来的一个bug,因为它引入了一些非常重要的升级,比如统一内存,如果没有NSight Visual Studio插件,他们可能无法对其进行很好的测试。毕竟,他们确实建议您使用带有该插件的VisualStudio进行开发,而我现在没有(合法)访问VisualStudio的权限


编辑:我现在几乎已经证实了。。。在英伟达GPU机上安装了AMD APP SDK,它运行完美无缺,所以NVIDIA似乎已经在CUDA工具包6版本中混用OpenCL。你知道他们正在通过CUDA与OpenCL竞争,我对此并不感到惊讶。

我也犯了同样的错误,最后我解决了这个问题,我所做的最新工作是:

1) 在cygwin中,安装名称中包含
opencl
的所有软件包

2) 接下来,在
…\cygwin\etc\OpenCL\vendors\
(我在那里找到了pocl.icd)创建
nvidia.icd
,并在那里放置一个字符串“/cygdrive/c/Windows/System32/nvopencl.dll”。英特尔OpenCL驱动程序也可以执行类似的操作

3) 最后,不要在CMake文件中出错(正如我所做的)。工作代码示例:

cmake_minimum_required(VERSION 3.6)

set(MODULE_NAME opencl-test)

project(${MODULE_NAME})

set(CMAKE_CXX_STANDARD 14)

find_package(OpenCL)

# set include directories
include_directories(${OpenCL_INCLUDE_DIRS})

# set source files
set(SOURCE_FILES main.cpp)
add_executable(${MODULE_NAME} ${SOURCE_FILES})

# linking
target_link_libraries(${MODULE_NAME} ${OpenCL_LIBRARY})

搜索“重新定位到合适的位置”会将您引导到其他链接中。欢迎使用SO和一个快速提示:为了增加您的问题得到回答的机会,您需要使其简洁,以便快速阅读。我编辑了你的问题以反映这一点。请检查并确保它包含您问题的要点。@Sabuncu我已经为您应用了您建议的编辑。人们似乎不太明白这是一个多么惊人的编辑。可能是因为他们懒得看;)@Veedrac非常感谢你。但我已经单独标记了这个问题,并请主持人注意。我对其他评论员仅仅根据“红色”(已删除)内容的数量快速判断编辑感到失望。再次感谢。我想我可以用更少的词来描述我的问题,但在我看来,你所做的相当重要的删减是过度的,因为这说明我没有做我的研究。“显而易见船长”发布的链接是我最先读到的东西之一,它一点帮助也没有,它只是证实了我的怀疑。