【问题标题】:Setting Various compilers in CMake for creating a shared library在 CMake 中设置各种编译器以创建共享库
【发布时间】:2021-09-09 21:36:55
【问题描述】:

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

项目结构如下-

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

【问题讨论】:

  • This post 可能会回答您的问题。简而言之,CMake 不支持在同一个 CMake 项目中为同一种语言使用多个编译器。
  • 感谢您的回复@JérômeRichard。虽然一个 CMake 文件可能没有该功能,但我认为每个文件夹可能包含一个专用的 CMakeLists.txt 并且“主”CMake 可以使用add_subdirectory 命令。专用的 Cmake 可以指定编译器和其他所有内容。另外,我想这个答案是旧的。正如这个答案所暗示的 (stackoverflow.com/questions/58861467/…),可以为项目中的某些文件指定编译语言。

标签: c++ cmake cuda sycl


【解决方案1】:

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* 变量设置可选标志。

【讨论】:

  • 感谢您的回复,我将尝试继续这些行并将其作为答案发布,以便社区可以审查并告知更多有关最佳实践的信息。此外,SYCL 本质上是 OpenCL 的 C++ 抽象。所以第三个编译器本质上是一个基于 clang 的编译器,它编译 C++ 文件中的 SYCL 代码并生成 SPIR。所以我可能会将编译器暴露给这些文件。无论如何,链接器语言仍然是 C++。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2012-02-29
  • 2016-12-30
  • 2013-07-04
  • 2011-10-28
  • 1970-01-01
相关资源
最近更新 更多