微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

项目结构如下-

/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 命令。这就是我卡住的地方,我不知道下一步该怎么做,如何将这两个文件夹与主文件和测试文件链接起来。

解决方法

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。