我有一个 CMake 项目,其中包含一个包含 C++(.cpp
) 和 CUDA C++(.cu
) 文件的目标。但是我有一些问题没有解决。
在我的 CMakeLists.txt
顶部,我有:
project(my-project CUDA CXX)
对于那些困惑的人:是的,CMake 3.8 使 CUDA C++ 成为一种内在支持的语言。所以不再需要使用像 cuda_add_executable()
这样的魔法。使用标准和 native CMake 命令一切正常。此外,显然您可以在 CMake 的 project()
命令中设置多种语言。请参阅:https://devblogs.nvidia.com/parallelforall/building-cuda-applications-cmake/
我现在的问题是我想以 CMake 的方式为不同的编译器设置不同的编译器标志(即,使用 target_compile_options()
命令)。我能想到的第一个解决方案是:
add_compile_options(my_target
PRIVATE
$<$<COMPILE_LANGUAGE:CXX>:-Wsign-conversion>
$<$<COMPILE_LANGUAGE:CUDA>:-arch=compute_30>
)
但是,我觉得这段代码有点难看。我能想到的另一种选择是创建两个单独的目标,一个用于 .cpp
文件,一个用于 .cu
文件。然后我将能够分别为 GCC 和 NVCC 目标设置编译器选项。
上述两种解决方案似乎都有效,但我正在尝试找出更好的方法。有什么建议么?优缺点?
当我想包含多个编译器标志时,我也遇到了第一个解决方案的问题。拆分它们的正确方法是什么?只是在不同标志之间使用空格?如果我想跨越多行表达式怎么办?如果我尝试以任何方式这样做,CMake 都会给我语法错误。
最后,我想避免手动更改 CMAKE_CXX_FLAGS
和 CMAKE_CUDA_FLAGS
。
提前致谢
最佳答案
我同意@OutOfBound 的评论,最简单的解决方案是将您的代码拆分到子项目中。这样您就可以独立控制每个项目标志,甚至可以构建多个具有不同标志的 .cu
文件(如果需要)。如果这变得更复杂,您可能还想使用 nvcc
构建内核并使用 cuModuleLoad*()
加载它们。
关于c++ - CMake 3.8+ : Setting different compiler flags for projects that include both . cpp (C++) 和 .cu (CUDA) 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46903060/