CUDA 6.5:错误MSB3191无法创建目录和LNK2001未解析的外部符号

时间:2014-12-31 10:38:43

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

我在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。这是日志输出:

    ------ Build build:Project:MyLib,配置:发布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 \助手\&#34 ;.不支持给定路径的格式。

    2> ------ Build build:Project:MyClient,配置:发布x64 ------ 2> MyLib.lib(MyCUDACode.obj):错误LNK2001:未解析的外部符号cudaGetDeviceCount

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

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

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

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

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

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

    2> C:... \ visual studio 2013 \ Projects \ Prj \ x64 \ Release \ MyClient.exe:致命错误LNK1120:7个未解析的外部

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

1 个答案:

答案 0 :(得分:4)

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

  • 解决错误(临时解决方法): MSB3191:无法创建目录不支持给定路径的格式。,只需将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。现在打开文件:&#34; C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ BuildCustomizations \ CUDA 6.5.props&#34; 。此props文件定义目标文件中使用的属性的值。现在在此道具文件中搜索单词 DepsOutputDir 。只有XML部分定义并引用此关键字:

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

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

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

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