我有一个跨平台的 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。
最佳答案
将我的评论变成答案:-o
标志用于说明编译器输出文件,这也是由 CMake 生成器本身完成的,而 -O
标志选择优化级别。虽然它似乎被 make
生成器生成的 make 文件忽略,但这个错误的标志似乎导致 ninja
生成器生成错误的编译器命令。
无论如何删除 -o0
标志或将其转换为 -O0
解决了您的简短示例中的问题,并使 ninja 版本也可以编译。
关于c++ - CMake 生成的 Ninja 项目在使用 GCC 编译时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40335245/