在 CMake 中设置各种编译器以创建共享库

Setting Various compilers in CMake for creating a shared library

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

项目结构如下-

/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++ 代码,使用这两个文件夹中存在的 headers,并且必须使用 GCC 进行编译。

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

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

CMake 允许一个编译器每种语言,所以简单地写这个就足够了:

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

add_subdirectory(Cuda)
add_subdirectory(SYCL)

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

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

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

Each Folder(Cuda and SYCL) can have their dedicated CmakeLists.txt which would specify the compiler and the various flags to go with it.

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

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

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