You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在不修改BINARY_DIR的情况下设置EXPORT_COMPILE_COMMANDS的输出目录?

问题描述

CMake会在构建目录(build/)中生成compile_commands.json文件,但我的YouCompleteMe(简称YCM)无法找到该文件。我需要将它移动到项目顶层目录,同时不想修改构建目录(BINARY_DIR)的位置,请问是否可以设置CMAKE_EXPORT_COMPILE_COMMANDS的输出目录?

项目结构

Project
|- CMakeLists.txt
|- compile_commands.json (期望位置)
|- build (项目构建目录) 
|-- compile_commands.json (当前生成位置)
|-- OtherCmakeGenerateStuff
|- src
|-- CMakeLists.txt
|-- main.cc (包含项目外的库)
|-lib
|-- CMakeLists.txt
|-- math
|--- CMakeLists.txt
|--- math.cc
|--- math.hh
|-include
|-- globals.hh
|-- definitions.hh

相关CMake文件内容

顶层CMakeLists.txt

cmake_minimum_require(VERSION 3.8)

project(just_some_project LANGUAGES CXX VERSION 1.0)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_subdirectory(src)
add_subdirectory(lib)
include_directories(include)

src/CMakeLists.txt

cmake_minimum_require(VERSION 3.8)

project(just_some_project LANGUAGES CXX VERSION 1.0)

find_project(someotherlibrary REQUIRED)

add_executable(main main.cc)
target_include_directories(main PUBLIC math someotherlibraryfound)

lib/CMakeLists.txt

cmake_minimum_require(VERSION 3.8)

file(GLOB Headers "*.hh")
file(GLOB Sources "*.cc")

add_library(math STATIC $Sources $Headers)

解决方案

CMake本身没有直接指定compile_commands.json输出目录的配置项,但可以通过添加自定义构建步骤,实现自动将文件复制到项目顶层,无需修改构建目录位置。

在顶层CMakeLists.txt中,替换原有的set(CMAKE_EXPORT_COMPILE_COMMANDS ON)部分,添加以下代码:

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# 自动同步compile_commands.json到项目顶层
if(CMAKE_EXPORT_COMPILE_COMMANDS)
  add_custom_target(
    copy_compile_commands ALL
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
      ${CMAKE_BINARY_DIR}/compile_commands.json
      ${CMAKE_SOURCE_DIR}/compile_commands.json
    DEPENDS ${CMAKE_BINARY_DIR}/compile_commands.json
  )
endif()

关键说明

  • copy_if_different仅在文件内容发生变化时执行复制,避免无意义的重复操作
  • ALL关键字让该目标随默认构建流程自动执行,每次构建都会同步最新的文件
  • DEPENDS确保只有当构建目录中的compile_commands.json更新后,才触发复制动作

另外,建议修正现有CMake文件中的几个语法错误:

  1. 所有cmake_minimum_require需改为cmake_minimum_required(缺少末尾的d)
  2. lib/CMakeLists.txt中的$Sources、$Headers要改为${Sources}、${Headers}
  3. src/CMakeLists.txt无需重复调用project,顶层已定义项目信息
  4. find_project是拼写错误,正确指令为find_package

内容的提问来源于stack exchange,提问作者Brothaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:31:57