【问题标题】:CMake 3.8+: Setting different compiler flags for projects that include both .cpp (C++) and .cu (CUDA) filesCMake 3.8+:为同时包含 .cpp (C++) 和 .cu (CUDA) 文件的项目设置不同的编译器标志
【发布时间】:2017-10-24 05:51:09
【问题描述】:

我有一个 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

提前谢谢你

【问题讨论】:

  • 两种解决方案对我来说都很好。对于.cu.cpp文件,我会使用您建议的针对不同目标的文件,以降低复杂性并避免链接阶段的不一致。

标签: c++ cmake cuda


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2023-03-23
    • 2020-12-22
    • 2020-02-05
    • 2023-04-07
    • 2015-06-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    相关资源
    最近更新 更多