我创建了一个非常简单的C++ / CMake项目:

CMakeLists.txt(注意-MD标志):

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
add_executable(moop main.cc)
target_compile_options(moop PRIVATE -MD)

main.cc:
#include "moop.hh"
int main( int, char** ) { return 0; }

moop.hh:
#pragma once

从项目根目录,运行以下命令:
mkdir build && cd build
cmake -G Ninja -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
cat compile_commands.json
cat compile_commands.json输出(请注意-MD标志):
{
  "directory": "/home/zbardoo/moop/build",
  "command": "/usr/bin/clang++      -MD -o CMakeFiles/moop.dir/main.cc.o -c /home/zbardoo/moop/main.cc",
  "file": "/home/zbardoo/moop/main.cc"
}

如果然后运行ninja,则可执行文件moop成功构建。但是,找不到moop.cc.d。但是,如果我然后从command复制并粘贴compile_commands.json值并运行它:
/usr/bin/clang++      -MD -o CMakeFiles/moop.dir/main.cc.o -c /home/zbardoo/moop/main.cc

出现/home/zbardoo/moop/build/CMakeFiles/moop.dir/main.cc.d文件:
zbardoo@localhost:~/moop/build$ cat CMakeFiles/moop.dir/main.cc.d
CMakeFiles/moop.dir/main.cc.o: /home/zbardoo/moop/main.cc \
  /home/zbardoo/moop/moop.hh

为什么ninja不遵守-MD文件中的compile_commands.json标志?

最佳答案

lang不是罪魁祸首,是宁加
缺少的CMakeFiles/moop.dir/main.cc.d的说明可以找到
如果您查看生成的build/rules.ninja并找到:

rule CXX_COMPILER__moop
  depfile = $DEP_FILE
  deps = gcc
  command = /usr/bin/clang++  $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in
  description = Building CXX object $out
注意:
  deps = gcc
然后看the Ninja manual: C/C++ header dependencies -> deps :

(我的重点)。

关于c++ - 当我使用CMake和Ninja构建时,clang++忽略-MD标志,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54154524/

10-11 22:23