1

我希望为我的项目中的不同文件夹设置各种编译器,这些编译器应该编译为共享库。

项目结构如下——

/Cuda
    a.cu
    b.cu
    c.cu
    header.cuh
/SYCL
    a.cpp
    b.cpp
    c.cpp
    header.h
main.cpp
test.cpp

Cuda 文件夹下的所有文件都必须由 nvcc 编译,SYCL 文件夹下的文件必须由系统路径中存在的特定编译器编译。这些文件夹之外的所有文件(即 main.cpp 和 test.cpp)都是普通的 C++ 代码,并使用这两个文件夹中的头文件,并且必须使用 GCC 编译。

我该如何为这样的项目结构(旨在成为共享库)编写 CMake。

编辑 - 项目不需要只有一个专用的 CMake。我的方法如下 -

  • 每个文件夹(Cuda 和 SYCL)都可以有它们专用的 CmakeLists.txt,它会指定编译器和与之配套的各种标志。
  • 文件夹外的主 CMake 可以使用该add_subdirectory命令。这就是我卡住的地方,我不确定下一步该怎么做,如何将这两个文件夹与主文件和测试文件链接起来。
4

1 回答 1

2

CMake 允许每种语言使用一个编译器,因此只需编写以下代码就足够了:

cmake_minimum_required(VERSION 3.20)
project(example LANGUAGES CXX CUDA)

add_subdirectory(Cuda)
add_subdirectory(SYCL)

CMAKE_CXX_COMPILER您可以通过设置和CMAKE_CUDA_COMPILER在配置命令行分别设置 C++ 和 CUDA 编译器。

$ cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_CXX_COMPILER=g++ -DCMAKE_CUDA_COMPILER=nvcc

另外,我想澄清这个误解:

每个文件夹(Cuda 和 SYCL)都可以有它们专用的 CmakeLists.txt,它会指定编译器和与之配套的各种标志。

CMakeLists.txt 文件不应尝试指定编译器。正确地做到这一点很棘手,不能总是做到(尤其是在这种add_subdirectory情况下),并且不必要地限制了您切换编译器的能力。也许您同时安装了 GCC 10 和 11,并想比较两者。

同样,您不应该在 CMakeLists.txt 文件中指定并非绝对需要构建的标志,并且您应该始终检查 CMake 文档以查看您感兴趣的标志是否已为您抽象出来。例如,CMake 对 C++ 语言标准(通过target_compile_features)和 CUDA 可分离编译(通过CUDA_SEPARABLE_COMPILATION目标属性)进行了特殊处理。

正如我在此处*_FLAGS*详述的那样,最好的解决方案是通过预设或工具链中的变量设置可选标志。

于 2021-06-27T16:15:26.950 回答