CMake编译工具
- 创业
- 2025-09-06 03:48:02

在使用 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 来查找可用的编译器。通常情况下:
在 Linux 或 macOS 上,默认的 C 编译器是 gcc,C++ 编译器是 g++。在 Windows 上,默认的编译器可能是 MSVC(如果安装了 Visual Studio),或者 MinGW 的 gcc 和 g++(如果安装了 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_COMPILER 和 CMAKE_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 之前,设置环境变量 CC 和 CXX:
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 build4. 总结 默认编译器: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 "")