【问题标题】:Linker error while building CUDA/C++ code构建 CUDA/C++ 代码时出现链接器错误
【发布时间】:2013-02-16 07:05:43
【问题描述】:

尝试在 Visual Studio 2012 中构建 CUDA/C++ 代码时出现以下错误。我使用的是 CUDA v5.0

1>  Generating Code...
1>LINK : warning LNK4044: unrecognized option '/MLd'; ignored
1>cublas_device.lib(kepler_sm35_gemm_wrapper.obj) : error LNK2019: unresolved external symbol __cudaRegisterLinkedBinary_59_tmpxft_00001040_00000000_8_kepler_sm35_gemm_wrapper_cpp1_ii_9402ff4f referenced in function "void __cdecl __sti____cudaRegisterAll_59_tmpxft_00001040_00000000_8_kepler_sm35_gemm_wrapper_cpp1_ii_9402ff4f(void)" (?__sti____cudaRegisterAll_59_tmpxft_00001040_00000000_8_kepler_sm35_gemm_wrapper_cpp1_ii_9402ff4f@@YAXXZ)

有人知道问题出在哪里吗?我试过谷歌搜索,但还没有找到解决方案。

非常感谢!

【问题讨论】:

  • 一个类似的帖子是stackoverflow.com/questions/2061715,你试过这个解决方案吗?
  • 嗨 Jermaine,是的,我在“配置属性->链接器->输入”中添加了正确的 CUDA 库路径,但我仍然收到此错误。事实上,cublas_device.lib(具有未解析的外部符号的文件)本身就是 CUDA 库的一部分——因此,我的链接器能够正确找到这些库文件。我认为这个库文件引用了链接器找不到的东西。此外,仅当我的 Visual Studio 配置平台为“调试”时才会发生这种情况。当它是“发布”时,可执行文件正确构建。
  • 好的,试试这两件事:首先添加 cudart.lib 如果您还没有添加,但可能您已经添加了。第二:尝试在您的应用程序属性-> 链接器选项中启用单独编译。看看是否有帮助。 (编辑:也尝试按照here 的描述删除 device-link.obj
  • 我没有看到在属性->链接器中启用单独编译的任何选项。您能否更具体地说明您希望我选择哪个选项?另外,您指的是链接器选项中的哪个部分?
  • 我相信这个问题是由于 -c/-dc/-rdc 开关的一些不正确组合被传递到各个模块和/或最后的链接步骤。如果您可以将针对每个模块发布到nvcc 的完整命令行以及构建应用程序的最终链接步骤粘贴到原始问题中,将会很有帮助。此外,这是否是您从 cuda 4.2(或更早版本)迁移到 cuda 5.0 的项目?

标签: c++ visual-c++ cuda linker gpu


【解决方案1】:

This article 显示有关 /MLd 链接器选项的作用的信息。它本质上与加载的多线程库和项目的配置有关。

【讨论】:

    【解决方案2】:

    您的(调试)项目是否设置为与 microsoft 链接器或 nvcc 链接? (错误消息似乎来自 microsoft 链接器。)您可能需要查看 this question

    设备代码和设备库(您要链接的)需要与 nvcc 链接。

    【讨论】:

      【解决方案3】:

      您需要链接到 CUDA 库的调试版本。您尝试在Debug 模式下编译,但随后链接到一个似乎不是在debug 模式下构建的库。这样就搞砸了。

      因此,您应该获取调试版本的.lib 文件,或者如果您有源代码,则自己构建它。然后,您将调试版本与调试 .lib 和发布链接。

      此外,使用相同版本的编译器构建所有 libs 可能会有所帮助,否则您可能会遇到名称混淆问题(这也可能是您的问题的潜在原因)。切换到较新的 VS 版本后发生在我身上:我必须重新编译我链接的所有 .lib

      【讨论】:

        【解决方案4】:

        它看起来像是某种使用未定义的外部(extern)变量。需要代码以获取更多信息

        【讨论】:

          【解决方案5】:

          我能够修复它!我正在链接到 cublas_device.lib,它指的是一个未解析的外部符号。但是,我的项目不需要此 lib 文件,因此只需将其从链接文件中删除即可!但是,在发布模式下,这个错误没有发生 - 可能是因为 cublas_device.lib 中的这部分代码位于调试部分。

          无论如何,由于我的项目不需要它,因此将其删除即可解决问题。

          非常感谢您的所有回复!

          【讨论】:

            【解决方案6】:

            我遇到了同样的问题,将配置类型从“动态库 (dll)”更改为“静态库 (lib)”对我有用。

            【讨论】:

              猜你喜欢
              • 2018-12-18
              • 1970-01-01
              • 1970-01-01
              • 2018-12-14
              • 2012-08-13
              • 1970-01-01
              • 2014-05-26
              • 1970-01-01
              • 2019-07-24
              相关资源
              最近更新 更多