【问题标题】:CUDA 6.5: error MSB3191 Unable to create directory and LNK2001 Unresolved External symbolCUDA 6.5:错误 MSB3191 无法创建目录和 LNK2001 无法解析外部符号
【发布时间】:2015-02-27 11:21:06
【问题描述】:

我在 Visual Studio 2013 x64 上运行 CUDA 6.5。

我有一个名为 MyLib 的 VC++ 静态库项目,它与 MyClient x64 控制台可执行项目链接。我为这两个项目添加了 CUDA 6.5 构建自定义。此外,我转到配置属性-> CUDA C/C++ 并将这两个项目的“目标机平台”设置为 64 位,因为我想为 x64 平台编译它们

我将 MyCUDACode.cpp 和 MyCUDACode.h 文件添加到 MyLib 项目中,并将它们的项目类型标记为 CUDA C/C++ 而不是 oc C/C++ 编译器。 MyCUDACode.cpp 有许多调用 CUDA API 函数的函数。此外,MyCUDACode.h 引用了 cuda.h 和 cuda_runtime.h 文件。

MyClient 与 MyLib 链接。我现在得到两个编译错误:

  • 编译 MyLib 时出现第一个错误,提示无法创建目录
  • 其次,链接时出现未解决的外部符号错误 MyClient 与 MyLib。这是日志输出:

    ------ 构建开始:项目:MyLib,配置:Release x64 ------ 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\CUDA 6.5.targets(412,9):错误MSB3191:无法创建目录“x64\Release\D:\ github\src\helpers\"。不支持给定路径的格式。

    2>------ 构建开始:项目:MyClient,配置:Release x64 ------ 2>MyLib.lib(MyCUDACode.obj) : error LNK2001: unresolved external symbol cudaGetDeviceCount

    2>MyLib.lib(MyCUDACode.obj) : error LNK2001: unresolved external symbol cudaDeviceCanAccessPeer

    2>MyLib.lib(MyCUDACode.obj) : 错误 LNK2001: 无法解析的外部符号 cudaGetDeviceProperties

    2>MyLib.lib(MyCUDACode.obj) : error LNK2001: unresolved external symbol cudaSetDevice

    2>MyLib.lib(MyCUDACode.obj) : error LNK2001: unresolved external symbol cudaDeviceDisablePeerAccess

    2>MyLib.lib(MyCUDACode.obj) : error LNK2001: unresolved external symbol cudaDeviceReset

    2>MyLib.lib(MyCUDACode.obj) : error LNK2001: unresolved external symbol cudaDeviceEnablePeerAccess

    2>C:...\visual studio 2013\Projects\Prj\x64\Release\MyClient.exe : 致命错误 LNK1120: 7 unresolved externals

我已经尝试了发布和调试模式,但我得到了同样的错误。

【问题讨论】:

  • 您是否查看了错误消息的第一行。您的项目设置中某处的路径格式错误。
  • 我可以看到:""x64\Release\D:\github\src\helpers\""。这个特定的文件夹“D:\github\src\helpers\”有 MyCUDACode.h 和 MyCUDACode.cpp 文件。但我不确定为什么 VS 使用这条路径
  • 当我检查 BuildCustomizations\CUDA 6.5.targets(412,9) 文件时,我看到以下内容:
  • @talonmies:我从头开始创建了两个示例项目(控制台和静态库)项目,并向其中添加了 CUDA 6.5 自定义。现在我没有得到 MSB3191:无法创建目录”,但我仍然得到未解决的外部符号错误
  • 好的,我找到了解决外部符号错误的方法。只需按照以下文本:链接器配置属性->链接器->常规->附加库目录的设置:$(CudaToolkitLibDir)$(CUDA_LIB_PATH)$(CUDA_PATH)\lib\$(PlatformName)配置属性->链接器->输入- >其他依赖 cuda.lib;cudart.lib;和其他库..

标签: c++ visual-studio-2013 cuda linker-errors


【解决方案1】:

我只是重现解决错误的步骤:

  • 解决错误(临时解决方法):MSB3191: Unable to create directory 不支持给定路径的格式。,只需将 Cuda cu 和 cuh 文件复制到 Visual Studio 项目文件夹即可。
  • [更新]:我最近找到了一个更好的解决方案MSB3191:无法创建目录给定路径的格式不受支持。。此修复程序无需将 cu 文件移动到 VS 项目文件夹即可工作。为此,请打开文件 "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\CUDA 6.5.targets",然后移至违规行(在这种情况下为 412)。此行包含以下 xml 部分:

    <MakeDir
        Condition="'%(CudaCompile.ExcludedFromBuild)' != 'true'"
        Directories="%(CudaCompile.DepsOutputDir)" />
    

    如您所见,这是一种指令,它告诉构建系统为正在编译的 cuda 文件创建一个文件夹。用于文件夹名称的属性是 CudaCompile.DepsOutputDir。现在打开文件:“C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations\CUDA 6.5.props”。这个道具文件定义了目标文件中使用的属性的值。现在在这个 props 文件中搜索单词 DepsOutputDir。只有 XML 部分定义和引用这个关键字是:

        <!-- Miscellaneous -->
        <DepsOutputFile>%(Filename)%(Extension).deps</DepsOutputFile>
        <DepsOutputDir>$(IntDir)%(RelativeDir)</DepsOutputDir>
        <DepsOutputPath>%(DepsOutputDir)%(DepsOutputFile)</DepsOutputPath> 
    

    现在,要最终解决 MSB3191 问题,只需从上面的 xml 部分中删除变量 %(RelativeDir) 并保存 props 文件(这需要管理员权限)

  • 要解决错误:LNK2001:无法解析的外部符号,请按照此post

  • 中的链接器设置部分进行操作

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2011-09-29
    • 2013-09-11
    • 2022-01-07
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多