【发布时间】:2016-10-31 00:52:07
【问题描述】:
我有一个跨平台的 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,我只导出CC 和CXX 标志:
export CC=clang-3.9
export CXX=clang++-3.9
然后我调用 cmake。
【问题讨论】:
-
minimal reproducible example 会很有帮助。还显示,如何将编译器设置为
gcc。 -
@Tsyvarev 添加了示例。这个非常简单的例子在
gcc下失败了,但在clang下工作正常 -
我们发现它与
o0标志有关,但无法解决问题,只能通过删除它或使用make生成器来代替。 -
我们意识到
-o用于编译器输出文件,而不是用于优化级别(-O)。没有深入检查,这里有一个可能的解释:虽然make生成器放置了两个-o参数以便只考虑第二个正确的参数,但ninja生成器可能会混淆或在添加@ 时生成错误的输出依赖项987654355@ 手动。无论如何删除-o0或使用-O0都可以解决问题。