CMake 生成的 Ninja 项目在使用 GCC 编译时失败

CMake generated Ninja project fails at compiling with GCC

我有一个跨平台 CMake 项目,它与 Linux 上的 make/gcc 以及 Windows 上的 MSVC 完美配合。我想尝试 ninja 并将其与 make 进行比较。这就是我创建 ninja 项目的方式:

cmake -GNinja ../Source/

然后我运行

ninja

但失败并出现此错误

/usr/bin/c++ -DmyPreprocessors ... -ImyIncludes ... -g3 -o0 -m32 -MMD -MT CMakeFiles/myProj.dir/myCode.cpp.o -MF CMakeFiles/myProj.dir/myCode.cpp.o.d -o CMakeFiles/myProj.dir/myCode.cpp.o -c /path/to/myCode.cpp 

cc1plus: fatal error: CMakeFiles/myProj.dir/myCode.cpp.d: No such file or directory

当我检查 CMakeFiles/myProj.dir/ 时,没有 myCode.cpp.d 文件。

但是当我将编译器更改为 clang 时,一切都神奇地工作了! Ninja 开始编译,然后成功链接。

当我在详细模式下 运行 ninja 时,我得到完全相同的命令,除了编译器是 clang (/usr/bin/c++ => /usr/bin/clang++-3.9)。

这是怎么回事?

编辑:

这是我用来重现相同错误的示例 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.5)
project(randomProj)

set(SOURCE_FILES myFile.cpp)

include_directories(Generic)

set(EXECUTABLE "TEST")

add_executable(${EXECUTABLE} ${SOURCE_FILES})
set(LIBRARY_SEARCH_PATH ${CMAKE_SOURCE_DIR}/path/to/my/libs)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w -g3 -o0")
target_link_libraries(${EXECUTABLE}  ${LIBRARIES})

我的myFile.cpp是这样的:

int main(){}

我没有为 gcc 明确指定任何内容。对于 clang 但是我只是导出 CCCXX 标志:

export CC=clang-3.9
export CXX=clang++-3.9

然后调用 cmake。

将我的评论变成答案:-o flag is for stating the compiler output file, which is also done by the CMake generator itself, while the -O 标志选择优化级别。虽然它似乎被 make 生成器生成的 make 文件忽略,但这个错误的标志似乎导致 ninja 生成器生成错误的编译器命令。

无论如何删除 -o0 标志或将其变成 -O0 解决了您的简短示例中的问题并使忍者版本也可以编译。