C++ CMake生成的Ninja项目在使用GCC编译时失败
我有一个跨平台的CMake项目,它在Linux上与C++ CMake生成的Ninja项目在使用GCC编译时失败,c++,makefile,cmake,ninja,C++,Makefile,Cmake,Ninja,我有一个跨平台的CMake项目,它在Linux上与make/gcc完美配合,在Windows上与MSVC完美配合。我想尝试一下《忍者》(ninja),并将其与《忍者》(make)进行比较。这就是我创建忍者项目的方式: cmake -GNinja ../Source/ 然后我就跑 ninja 但由于这个错误,它失败了 /usr/bin/c++ -DmyPreprocessors ... -ImyIncludes ... -g3 -o0 -m32 -MMD -MT CMakeFiles/myPr
make/gcc
完美配合,在Windows上与MSVC
完美配合。我想尝试一下《忍者》(ninja),并将其与《忍者》(make)进行比较。这就是我创建忍者
项目的方式:
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
当我检查cmakfiles/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
,我只导出CC
和CXX
标志:
export CC=clang-3.9
export CXX=clang++-3.9
然后我调用cmake。将我的评论转换为答案:该标志用于说明编译器输出文件,这也是由cmake生成器本身完成的,而该标志选择优化级别。虽然
make
生成器生成的make文件似乎忽略了它,但此错误标志似乎会导致ninja
生成器生成错误的编译器命令
无论如何,删除
-o0
标志或将其转换为-o0
可以解决您的简短示例中的问题,并使忍者版本也可以编译。在这方面会有所帮助。还显示了如何将编译器设置为gcc
@Tsyvarev添加了示例。这个非常简单的示例在使用gcc
时失败,但在使用clang
时效果很好。我们发现它与o0
标志相关,但无法解决问题,只能删除它或使用make
生成器。我们意识到-o
用于编译器输出文件,而不是用于优化级别(-O
)。在没有深入检查的情况下,这里有一个可能的解释:make
生成器放置两个-o
参数,以便只考虑第二个正确的参数,但是ninja
生成器在手动添加-o
时可能会混淆或生成错误的输出依赖项。无论如何,删除-o0
或者使用-O0
可以解决问题。