CMake生成的Ninja项目未能与GCC进行编译

时间:2016-10-31 00:52:07

标签: 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时,除了编译器为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。

1 个答案:

答案 0 :(得分:1)

将我的评论变成答案:-o标志用于说明编译器输出文件,这也由CMake生成器本身完成,而-O标志用于选择优化级别。尽管make生成器生成的make文件似乎忽略了该文件,但此错误标志似乎导致ninja生成器生成了错误的编译器命令。

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