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

时间:2017-10-24 05:51:10

标签: c++ cmake 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_FLAGSCMAKE_CUDA_FLAGS

提前谢谢

1 个答案:

答案 0 :(得分:1)

我同意@OutOfBound的评论,最简单的解决方案是将您的代码拆分到子项目中。这样,您可以独立控制每个项目标志,甚至可以使用不同的标志(如果需要)构建多个.cu文件。如果这变得更复杂,您可能还希望使用nvcc构建内核并使用cuModuleLoad*()加载它们。