CMake 3.8:为包含.cpp(C)和.cu(CUDA)文件的项目设置不同的编译器标志

我有一个CMake项目,其中包含一个包含C(.cpp)和CUDA C(.cu)文件的目标.但是我有一些问题没有解决.

在我的CMakeLists.txt的顶部,我有:

project(my-project CUDA CXX)

对于困惑的人:是的,CMake 3.8使CUDA C成为一种内在支持的语言.所以不再需要使用像cuda_add_executable()这样的东西.通过使用标准和本机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 *()加载它们.

转载注明原文:CMake 3.8:为包含.cpp(C)和.cu(CUDA)文件的项目设置不同的编译器标志 - 代码日志