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

标签 c++ makefile cmake ninja

我有一个跨平台的 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标志用于说明编译器输出文件,这也是由 CMake 生成器本身完成的,而 -O标志选择优化级别。虽然它似乎被 make 生成器生成的 make 文件忽略,但这个错误的标志似乎导致 ninja 生成器生成错误的编译器命令。

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

关于c++ - CMake 生成的 Ninja 项目在使用 GCC 编译时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40335245/

相关文章:

c++ - InnoSetup - 检查是否安装了 visual studio 2010 crt redist,如果没有则运行安装程序

makefile - autotools -- make[1] : *** No rule to make target `all' . 停止

c++ - C/C++ 中的#include 是多余的吗?

cmake - 不同目标中同一文件的不同编译标志

c++ - 关于C++中unsigned char类型的大小

c++ - 类模板特化的问题

c++ - 为什么 -2147483648 和 (int)-2147483648 不同

c++ - <image>.h - 这个 -e 来自哪里?

c++: 未定义的错误引用

cmake - 使用 CMake 链接 GLEW