Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake生成的Ninja项目在使用GCC编译时失败_C++_Makefile_Cmake_Ninja - Fatal编程技术网

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

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

我有一个跨平台的CMake项目,它在Linux上与
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
可以解决问题。