在 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。我的方法如下 -
- 每个文件夹(Cuda 和 SYCL)都可以有其专用的 CmakeLists.txt,这将指定编译器和与之配套的各种标志。
- 文件夹外的高手CMake可以使用
add_subdirectory
命令。这就是我卡住的地方,我不确定下一步该怎么做,如何 link 这两个文件夹以及主文件和测试文件。
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
另外,我想澄清一下这个误解:
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*
变量设置可选标志。
我希望为我的项目中的不同文件夹设置各种编译器,这些编译器应该编译成一个共享库。
项目结构如下-
/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。我的方法如下 -
- 每个文件夹(Cuda 和 SYCL)都可以有其专用的 CmakeLists.txt,这将指定编译器和与之配套的各种标志。
- 文件夹外的高手CMake可以使用
add_subdirectory
命令。这就是我卡住的地方,我不确定下一步该怎么做,如何 link 这两个文件夹以及主文件和测试文件。
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
另外,我想澄清一下这个误解:
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*
变量设置可选标志。