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