当前位置: 首页 > news >正文

CMake 编译工具

在使用 CMake 时,你可以通过指定工具链文件来设置编译器(如 GCC、G++ 或 Clang)。以下是具体步骤:

1. 创建工具链文件

首先,创建一个工具链文件(例如 toolchain.cmake),并在其中指定编译器路径和选项。

# toolchain.cmake

# 设置 C 编译器
set(CMAKE_C_COMPILER /path/to/gcc)  # 或者 /path/to/clang

# 设置 C++ 编译器
set(CMAKE_CXX_COMPILER /path/to/g++)  # 或者 /path/to/clang++

# 设置其他工具链选项(可选)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")

2. 使用工具链文件

在运行 CMake 时,通过 -DCMAKE_TOOLCHAIN_FILE 参数指定工具链文件。

cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake -S /path/to/source -B /path/to/build

3. 直接指定编译器(不推荐)

如果你不想使用工具链文件,也可以在命令行中直接指定编译器:

cmake -DCMAKE_C_COMPILER=/path/to/gcc -DCMAKE_CXX_COMPILER=/path/to/g++ -S /path/to/source -B /path/to/build

4. 检查编译器

在配置完成后,可以通过以下命令检查编译器是否正确设置:

cmake --build /path/to/build --verbose

示例

假设你使用 Clang 作为编译器,工具链文件 toolchain.cmake 可以这样写:

# toolchain.cmake

set(CMAKE_C_COMPILER /usr/bin/clang)
set(CMAKE_CXX_COMPILER /usr/bin/clang++)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")

然后在命令行中运行:

cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake -S . -B build

这样,CMake 就会使用 Clang 作为编译器。

总结

  • 工具链文件:推荐使用工具链文件来管理编译器设置。
  • 命令行指定:可以直接在命令行中指定编译器,但不推荐用于复杂项目。
  • 检查设置:配置完成后,检查编译器是否正确设置。

通过这些步骤,你可以轻松地在 CMake 中设置编译器。


在 CMake 中,默认的编译器取决于系统的环境变量(如 PATH)和 CMake 的默认行为。以下是关于默认编译器以及如何获取当前使用的编译器的详细说明:


1. CMake 默认的编译器

CMake 默认会根据系统的环境变量 PATH 来查找可用的编译器。通常情况下:

  • LinuxmacOS 上,默认的 C 编译器是 gcc,C++ 编译器是 g++
  • Windows 上,默认的编译器可能是 MSVC(如果安装了 Visual Studio),或者 MinGWgccg++(如果安装了 MinGW)。

CMake 会优先选择系统中最常用的编译器。如果你安装了多个编译器(例如 GCC 和 Clang),CMake 会选择第一个在 PATH 中找到的编译器。


2. 如何获取当前使用的编译器

在 CMake 中,你可以通过以下方式获取当前使用的编译器:

方法 1:在 CMake 配置时输出编译器信息

CMakeLists.txt 中添加以下内容,可以在配置时打印当前使用的编译器:

message(STATUS "CMAKE_C_COMPILER = ${CMAKE_C_COMPILER}")
message(STATUS "CMAKE_CXX_COMPILER = ${CMAKE_CXX_COMPILER}")

运行 CMake 配置时,你会看到类似以下的输出:

-- CMAKE_C_COMPILER = /usr/bin/gcc
-- CMAKE_CXX_COMPILER = /usr/bin/g++
方法 2:查看 CMake 缓存文件

CMake 会将编译器路径存储在缓存文件 CMakeCache.txt 中。你可以在构建目录中打开该文件,搜索 CMAKE_C_COMPILERCMAKE_CXX_COMPILER,例如:

grep CMAKE_C_COMPILER CMakeCache.txt
grep CMAKE_CXX_COMPILER CMakeCache.txt

输出示例:

CMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc
CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++
方法 3:在命令行中查询

在配置完成后,你可以通过以下命令查询当前使用的编译器:

cmake --build /path/to/build --verbose

这会显示详细的构建信息,包括使用的编译器。


3. 如何修改默认编译器

如果你希望修改默认的编译器,可以通过以下方式:

方法 1:设置环境变量

在运行 CMake 之前,设置环境变量 CCCXX

export CC=/path/to/clang
export CXX=/path/to/clang++
cmake -S . -B build
方法 2:在 CMake 命令行中指定

直接在 CMake 命令行中指定编译器:

cmake -DCMAKE_C_COMPILER=/path/to/clang -DCMAKE_CXX_COMPILER=/path/to/clang++ -S . -B build
方法 3:使用工具链文件

创建一个工具链文件(如 toolchain.cmake),并在其中指定编译器:

set(CMAKE_C_COMPILER /path/to/clang)
set(CMAKE_CXX_COMPILER /path/to/clang++)

然后在命令行中指定工具链文件:

cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake -S . -B build

4. 总结

  • 默认编译器:CMake 默认使用系统 PATH 中的第一个可用编译器(通常是 GCC 或 Clang)。
  • 获取当前编译器:可以通过 message 输出、查看 CMakeCache.txt 或使用 --verbose 构建命令来获取当前使用的编译器。
  • 修改编译器:通过环境变量、命令行参数或工具链文件可以修改默认编译器。

通过这些方法,你可以轻松管理和检查 CMake 中使用的编译器。


参考/home/mi/local/cmake_test/CMakeFiles/3.31.5/CMakeCCompiler.cmake

set(CMAKE_C_COMPILER "/usr/bin/cc")
set(CMAKE_C_COMPILER_ARG1 "")
set(CMAKE_C_COMPILER_ID "GNU")
set(CMAKE_C_COMPILER_VERSION "13.1.0")
set(CMAKE_C_COMPILER_VERSION_INTERNAL "")
set(CMAKE_C_COMPILER_WRAPPER "")
set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17")
set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON")
set(CMAKE_C_STANDARD_LATEST "23")
set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23")
set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes")
set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros")
set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert")
set(CMAKE_C17_COMPILE_FEATURES "c_std_17")
set(CMAKE_C23_COMPILE_FEATURES "c_std_23")

set(CMAKE_C_PLATFORM_ID "Linux")
set(CMAKE_C_SIMULATE_ID "")
set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU")
set(CMAKE_C_SIMULATE_VERSION "")

set(CMAKE_AR "/usr/bin/ar")
set(CMAKE_C_COMPILER_AR "/usr/bin/gcc-ar-13")
set(CMAKE_RANLIB "/usr/bin/ranlib")
set(CMAKE_C_COMPILER_RANLIB "/usr/bin/gcc-ranlib-13")
set(CMAKE_LINKER "/usr/bin/ld")
set(CMAKE_LINKER_LINK "")
set(CMAKE_LINKER_LLD "")
set(CMAKE_C_COMPILER_LINKER "/usr/bin/ld")
set(CMAKE_C_COMPILER_LINKER_ID "GNU")
set(CMAKE_C_COMPILER_LINKER_VERSION 2.38)
set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU)
set(CMAKE_MT "")
set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND")
set(CMAKE_COMPILER_IS_GNUCC 1)
set(CMAKE_C_COMPILER_LOADED 1)
set(CMAKE_C_COMPILER_WORKS TRUE)
set(CMAKE_C_ABI_COMPILED TRUE)

set(CMAKE_C_COMPILER_ENV_VAR "CC")

set(CMAKE_C_COMPILER_ID_RUN 1)
set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m)
set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)
set(CMAKE_C_LINKER_PREFERENCE 10)
set(CMAKE_C_LINKER_DEPFILE_SUPPORTED )

# Save compiler ABI information.
set(CMAKE_C_SIZEOF_DATA_PTR "8")
set(CMAKE_C_COMPILER_ABI "ELF")
set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN")
set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu")

if(CMAKE_C_SIZEOF_DATA_PTR)
  set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}")
endif()

if(CMAKE_C_COMPILER_ABI)
  set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}")
endif()

if(CMAKE_C_LIBRARY_ARCHITECTURE)
  set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu")
endif()

set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "")
if(CMAKE_C_CL_SHOWINCLUDES_PREFIX)
  set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}")
endif()

set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/13/include;/usr/local/include;/usr/include/x86_64-linux-gnu;/usr/include")
set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;gcc_s;c;gcc;gcc_s")
set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/13;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib")
set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "")

相关文章:

  • python基础语法
  • Spring Boot 与 Java 决策树:构建智能分类系统
  • 把程序加入开机自启动
  • 数据结构——单向循环链表、双链表、双向循环链表
  • Ubuntu 下 MySQL 安装与配置全攻略:从入门到精通
  • Zotero PDF Translate插件配置百度翻译api
  • 算法——前缀和
  • 采用 Ansys Workbench CFX 的 TwinMesh 应用
  • 分享一款AI绘画图片展示和分享的小程序
  • C++中的顺序容器(一)
  • Java零基础入门笔记:(3)程序控制
  • 单线程模拟n个线程的L函数
  • docker push镜像到阿里云
  • 网络药理学与LiP-MS:小分子药物研究的天合之作
  • 从零开始在Windows系统上搭建一个node.js后端服务项目
  • 蓝耘智算携手DeepSeek,共创AI未来
  • Java中的集合框架:List、Set和Map有什么区别?
  • 第G7周:Semi-Supervised GAN 理论与实战
  • 【Linux】文件管理
  • 代码随想录DAY32|动态规划、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • 节前A股持续震荡,“五一”假期持股还是持币过节胜率更高?
  • 体坛联播|安切洛蒂预计执教巴西国家队,利拉德确诊跟腱撕裂
  • 吕国范任河南省人民政府副省长
  • 全国电影工作会:聚焦扩大电影国际交流合作,提升全球影响力
  • 广东一公司违规开展学科培训被罚没470万,已注销营业执照
  • 一张老照片里蕴含的上海文脉