c++ - CMake 3.8+ : Setting different compiler flags for projects that include both . cpp (C++) 和 .cu (CUDA) 文件

标签 c++ cmake cuda

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

相关文章:

c++ - 将字符串转换为十六进制数组数据

c++ - 配置itkvtkglue时CMake报错

CMake 条件预处理器在代码上定义

qt - 如何重新配置​​之前配置的 Qt Creator 项目?

.net - .NET 中的 CUDA 全局内存释放问题

sorting - CUDA:在排序功能中使用比较器时,Thrust 如何管理内存?

c++ - 如何在 Qt 中使用线程将文本添加到文本编辑器

c++ - 是否有良好/广泛采用的 c++ 模板编码约定/标准?

c++ - 如何将成员函数传递给另一个成员函数中使用的函数?

c++ - 如何在设备上运行 thrust::count_if? (库达)