【问题标题】:CUDA 5.5 - Relocatable device code causes unresolved external symbolCUDA 5.5 - 可重定位设备代码导致无法解析的外部符号
【发布时间】:2015-08-12 18:47:07
【问题描述】:

我使用的是 CUDA 5.5,我的编译器是 VC2012。我的项目包含 2 个 .cu 文件。我需要使用动态并行,所以我启用了“生成可重定位设备代码”选项。一旦启用此选项,我就会收到以下链接错误:

error LNK2001: unresolved external symbol __fatbinwrap_54_tmpxft_0000110c_00000000_8_cuda_device_runtime_cpp1_ii_5f6993ef

如果我关闭该选项,错误就会消失。该错误不取决于文件的内容 - 如果我注释掉其中的所有内容(#if 0 .... #endif 以便它们本质上是空文件),我仍然会收到相同的错误。

更新:我安装了 VC2010,但仍然收到完全相同的错误消息!
更新 2: 我对这整件事感到非常厌倦,所以我从 SDK 示例 (cdpSimplePrint) 中获取了一个来自 VC2010 的动态并行示例项目,替换了其中的文件并进行了编译。问题消失了。试图比较两个项目之间的设置,但我找不到任何东西。 我不知道是什么原因造成的,但坦率地说,在这个阶段我已经不在乎了,只要我有解决方法。

【问题讨论】:

  • 你链接的是正确版本的 CUDART 吗?
  • @Ivan Solntsev 我该如何检查?

标签: cuda


【解决方案1】:

检查您是否链接到 cudadevrt 库,有关详细信息,请参阅 CUDA Dynamic Parallelism Programming Guide 中的“编译和链接”部分。

【讨论】:

  • 是的,我在项目属性的 nvlink 中添加了 -lcudadevrt。在我这样做之前,还有更多未解析的符号。上面的链接错误不是来自CUDA链接器,而是来自VC链接器。
  • 我在尝试时收到以下链接错误:cudadevrt.lib(cuda_device_runtime.obj):错误 LNK2038:检测到“_MSC_VER”不匹配:值“1600”与值“1700”不匹配kernel.cu.obj 我查看了发行说明 (developer.nvidia.com/sites/default/files/akamai/cuda/files/…),它没有提到 cudadevrt 和 VC2012。不过,它确实谈到了 VC2012 中 cudart 库 cudart.lib 的静态版本的一些问题。你认为这有关系吗?
  • 您是否安装了 VS2010 和 VS2012?你能检查一下 CUDA 编译/链接步骤和 C++ 编译器/链接步骤是否选择了相同的版本?我没有 VS2012,但在早期版本中,您可以选择使用哪个工具链,VC11 == _MSC_VER 1700 == VS2012。
  • 如果您正在构建项目的调试版本,请尝试构建发布版本,看看结果是否有所不同(就 VC 链接错误而言)。在 CUDA 5.5 RC 中,只有(VS2010) 包含静态 cudart 库的 release 版本,我不确定是否同样适用于设备 cudart 库。如果尚未指定,我还会将--cudart=shared 添加为 nvcc 开关,尽管我认为它与这个特定问题无关。
  • @Tom:我只安装了 VC2012,所以这不是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2022-08-03
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多