首页 > 解决方案 > 使用 CMake 将 std::filesystem 与 CUDA 一起使用

问题描述

我有一个与这里已经描述的类似的问题,但我使用的是 cmake 3.18.0

在我的CMakeLists.txt文件中,我有以下几行来启用正确的c++标准:

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CUDA_STANDARD 17)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_EXTENSIONS OFF)
set(CMAKE_CUDA_ARCHITECTURES OFF)
set(CMAKE_CUDA_SEPARABLE_COMPILATION ON)
set(CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES ON)

但我仍然收到以下错误消息:error : namespace "std" has no member "filesystem". 我准备了一个与我的真实项目结构接近的小型 github项目。

错误信息:

[main] Building folder: cuda-test 
[build] Starting build
[proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --build c:/Projects/C++/cuda-test/build --config Debug --target ALL_BUILD -- /maxcpucount:10
[build] Microsoft (R) Build Engine version 16.6.0+5ff7b0c9e for .NET Framework
[build] Copyright (C) Microsoft Corporation. All rights reserved.
[build] 
[build]   test.cpp
[build]   test_library.vcxproj -> C:\Projects\C++\cuda-test\build\test_library\Debug\test_library.lib
[build]   Compiling CUDA source file ..\..\test_prog\src\test.cu...
[build]   
[build]   C:\Projects\C++\cuda-test\build\test_prog>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\HostX64\x64" -x cu -rdc=true  -I"C:\Projects\C++\cuda-test\test_library\src" -I"C:\Projects\C++\cuda-test\test_library\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include"     --keep-dir x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static -Xcompiler="/EHsc -Zi -Ob0" -g   -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"" -DWIN32 -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"" -D_MBCS -Xcompiler "/EHsc /W1 /nologo /Od /Fdtest_prog.dir\Debug\vc142.pdb /FS /Zi /RTC1 /MDd /GR" -o test_prog.dir\Debug\test.obj "C:\Projects\C++\cuda-test\test_prog\src\test.cu" 
[build] C:\Projects\C++\cuda-test\test_library\include\utils/fs.h(6): error : namespace "std" has no member "filesystem" [C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj]
[build]   
[build]   1 error detected in the compilation of "C:/Projects/C++/cuda-test/test_prog/src/test.cu".
[build]   test.cu
[build] C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 11.0.targets(772,9): error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\HostX64\x64" -x cu -rdc=true  -I"C:\Projects\C++\cuda-test\test_library\src" -I"C:\Projects\C++\cuda-test\test_library\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include"     --keep-dir x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static -Xcompiler="/EHsc -Zi -Ob0" -g   -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"" -DWIN32 -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"" -D_MBCS -Xcompiler "/EHsc /W1 /nologo /Od /Fdtest_prog.dir\Debug\vc142.pdb /FS /Zi /RTC1 /MDd /GR" -o test_prog.dir\Debug\test.obj "C:\Projects\C++\cuda-test\test_prog\src\test.cu"" exited with code 1. [C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj]
[build] Build finished with exit code 1

详细错误消息:

Microsoft (R) Build Engine version 16.6.0+5ff7b0c9e for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 27/08/2020 20:51:34.
     1>Project "C:\Projects\C++\cuda-test\build\ALL_BUILD.vcxproj" on node 1 (default targets).
     1>Project "C:\Projects\C++\cuda-test\build\ALL_BUILD.vcxproj" (1) is building "C:\Projects\C++\cuda-test\build\ZERO_CHECK.vcxproj" (2) on node 1 (default targets).
     2>InitializeBuildStatus:
         Creating "x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
       CustomBuild:
         All outputs are up-to-date.
       FinalizeBuildStatus:
         Deleting file "x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild".
         Touching "x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\ZERO_CHECK.lastbuildstate".
     2>Done Building Project "C:\Projects\C++\cuda-test\build\ZERO_CHECK.vcxproj" (default targets).
     1>Project "C:\Projects\C++\cuda-test\build\ALL_BUILD.vcxproj" (1) is building "C:\Projects\C++\cuda-test\build\test_library\test_library.vcxproj" (3) on node 1 (default targets).
     3>InitializeBuildStatus:
         Creating "test_library.dir\Debug\test_library.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
       CustomBuild:
         All outputs are up-to-date.
       VcpkgTripletSelection:
         Using triplet "x64-windows" from "C:\Libraries\vcpkg\installed\x64-windows\"
       ClCompile:
         All outputs are up-to-date.
       Lib:
         All outputs are up-to-date.
         test_library.vcxproj -> C:\Projects\C++\cuda-test\build\test_library\Debug\test_library.lib
       AppLocalFromInstalled:
         C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -noprofile -File "C:\Libraries\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "C:\Projects\C++\cuda-test\build\test_library\Debug\test_library.lib" "C:\Libraries\v
         cpkg\installed\x64-windows\debug\bin" "test_library.dir\Debug\test_library.tlog\test_library.write.1u.tlog" "test_library.dir\Debug\vcpkg.applocal.log"
       FinalizeBuildStatus:
         Deleting file "test_library.dir\Debug\test_library.tlog\unsuccessfulbuild".
         Touching "test_library.dir\Debug\test_library.tlog\test_library.lastbuildstate".
     3>Done Building Project "C:\Projects\C++\cuda-test\build\test_library\test_library.vcxproj" (default targets).
     1>Project "C:\Projects\C++\cuda-test\build\ALL_BUILD.vcxproj" (1) is building "C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj" (4) on node 2 (default targets).
     4>InitializeBuildStatus:
         Touching "test_prog.dir\Debug\test_prog.tlog\unsuccessfulbuild".
       CustomBuild:
         All outputs are up-to-date.
       AddCudaCompileDeps:
       Skipping target "AddCudaCompileDeps" because all output files are up-to-date with respect to the input files.
       AddCudaCompilePropsDeps:
       Skipping target "AddCudaCompilePropsDeps" because all output files are up-to-date with respect to the input files.
       WriteCudaCompileTlogs:
       Skipping target "WriteCudaCompileTlogs" because all output files are up-to-date with respect to the input files.
     4>Project "C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj" (4) is building "C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj" (4:2) on node 2 (CudaBuildCore target(s)).
     4>CudaBuildCore:
         Compiling CUDA source file ..\..\test_prog\src\test.cu...
         cmd.exe /C "C:\Users\Jens\AppData\Local\Temp\tmp1de6300221cc483aa1ca166f3b73906a.cmd"
         "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\HostX64\
         x64" -x cu -rdc=true  -I"C:\Projects\C++\cuda-test\test_library\src" -I"C:\Projects\C++\cuda-test\test_library\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include"     --keep-dir x64\Debug -maxrregcount=0  --machine 64 --c
         ompile -cudart static -Xcompiler="/EHsc -Zi -Ob0" -g   -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"" -DWIN32 -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"" -D_MBCS -Xcompiler "/EHsc /W1 /nologo /Od /Fdtest_prog.dir\Debug\vc142.pdb /FS /Zi /RTC1 /MDd /GR" -o test_p
         rog.dir\Debug\test.obj "C:\Projects\C++\cuda-test\test_prog\src\test.cu"
         
         C:\Projects\C++\cuda-test\build\test_prog>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe" -gencode=arch=compute_52,code=\"sm_52,compute_52\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Commun
         ity\VC\Tools\MSVC\14.26.28801\bin\HostX64\x64" -x cu -rdc=true  -I"C:\Projects\C++\cuda-test\test_library\src" -I"C:\Projects\C++\cuda-test\test_library\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include"     --keep-dir x
         64\Debug -maxrregcount=0  --machine 64 --compile -cudart static -Xcompiler="/EHsc -Zi -Ob0" -g   -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"" -DWIN32 -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"" -D_MBCS -Xcompiler "/EHsc /W1 /nologo /Od /Fdtest_prog.dir\Debug\v
         c142.pdb /FS /Zi /RTC1 /MDd /GR" -o test_prog.dir\Debug\test.obj "C:\Projects\C++\cuda-test\test_prog\src\test.cu" 
     4>C:\Projects\C++\cuda-test\test_library\include\utils/fs.h(6): error : namespace "std" has no member "filesystem" [C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj]
         
         1 error detected in the compilation of "C:/Projects/C++/cuda-test/test_prog/src/test.cu".
         test.cu
     4>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 11.0.targets(772,9): error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe" -gencode=arch=c
       ompute_52,code=\"sm_52,compute_52\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\HostX64\x64" -x cu -rdc=true  -I"C:\Projects\C++\cuda-test\test_library\src" -I"C:\Projects\C++\c
       uda-test\test_library\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include"     --keep-dir x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static -Xcompiler="/EHsc -Zi -Ob0" -g   -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"
       " -DWIN32 -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"" -D_MBCS -Xcompiler "/EHsc /W1 /nologo /Od /Fdtest_prog.dir\Debug\vc142.pdb /FS /Zi /RTC1 /MDd /GR" -o test_prog.dir\Debug\test.obj "C:\Projects\C++\cuda-test\test_prog\src\test.cu"" exited with code 1.
        [C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj]
     4>Done Building Project "C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj" (CudaBuildCore target(s)) -- FAILED.
     4>Done Building Project "C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj" (default targets) -- FAILED.
     1>Done Building Project "C:\Projects\C++\cuda-test\build\ALL_BUILD.vcxproj" (default targets) -- FAILED.

Build FAILED.

       "C:\Projects\C++\cuda-test\build\ALL_BUILD.vcxproj" (default target) (1) ->
       "C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj" (default target) (4) ->
       "C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj" (CudaBuildCore target) (4:2) ->
       (CudaBuildCore target) -> 
         C:\Projects\C++\cuda-test\test_library\include\utils/fs.h(6): error : namespace "std" has no member "filesystem" [C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj]
         C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 11.0.targets(772,9): error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin\nvcc.exe" -gencode=arch
       =compute_52,code=\"sm_52,compute_52\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\HostX64\x64" -x cu -rdc=true  -I"C:\Projects\C++\cuda-test\test_library\src" -I"C:\Projects\C++
       \cuda-test\test_library\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\include"     --keep-dir x64\Debug -maxrregcount=0  --machine 64 --compile -cudart static -Xcompiler="/EHsc -Zi -Ob0" -g   -D_WINDOWS -D"CMAKE_INTDIR=\"Debug
       \"" -DWIN32 -D_WINDOWS -D"CMAKE_INTDIR=\"Debug\"" -D_MBCS -Xcompiler "/EHsc /W1 /nologo /Od /Fdtest_prog.dir\Debug\vc142.pdb /FS /Zi /RTC1 /MDd /GR" -o test_prog.dir\Debug\test.obj "C:\Projects\C++\cuda-test\test_prog\src\test.cu"" exited with code 
       1. [C:\Projects\C++\cuda-test\build\test_prog\test_prog.vcxproj]

    0 Warning(s)
    2 Error(s)

Time Elapsed 00:00:02.61

标签: c++cmakecuda

解决方案


正如这里这里所提到的,这是 cmake v3.18.2或更低版本中的一个已知错误,有望在 cmake v3.18.3中得到解决。

为了解决这个问题,我将以下几行添加到我的CMakeLists.txt

# hack for cuda before cmake 3.18.3
if(${CMAKE_VERSION} VERSION_LESS "3.18.3")
  target_compile_options(cuda_test_prog PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:--std=c++17>)
endif()

推荐阅读