【问题标题】:CMake generated Ninja project fails at compiling with GCCCMake 生成的 Ninja 项目在使用 GCC 编译时失败
【发布时间】: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,我只导出CCCXX 标志:

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 都可以解决问题。

标签: c++ makefile cmake ninja


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2013-05-12
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多