CMake 找不到 Ninja

Posted

技术标签:

【中文标题】CMake 找不到 Ninja【英文标题】:Ninja not found by CMake 【发布时间】:2016-07-29 11:45:54 【问题描述】:

我正在尝试使用 CMake 从 GitHub 构建一些代码,但不断收到以下错误:

CMake Error: CMake was unable to find a build program corresponding to "Ninja".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_C_COMPILER_ENV_VAR
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_C_COMPILER
CMake Error: Could not find cmake module file:/golang/project/src/github.com/devsisters/goquic/libquic/build/debug/CMakeFiles/2.8.11/CMakeCCompiler.cmake
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_CXX_COMPILER_ENV_VAR
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_CXX_COMPILER
CMake Error: Could not find cmake module file:/golang/project/src/github.com/devsisters/goquic/libquic/build/debug/CMakeFiles/2.8.11/CMakeCXXCompiler.cmake
-- Configuring incomplete, errors occurred!

如何正确设置这些变量?

我使用 GitHub 代码附带的 ./build_libs.sh 文件来构建它。

【问题讨论】:

那么,您想在 CMake 中使用什么构建系统?忍者?还是 Makefile? 我已经下载了忍者来制作文件。 如何设置使用哪个构建系统?我也有 makefile,可以使用其中任何一个 将您使用的命令行添加到问题中。如果在命令行上运行 ninja 会发生什么? 我得到这个错误:ninja: command not found 【参考方案1】:

您正在执行的脚本使用 CMake Ninja 生成器。为此,您需要在路上忍者。在大多数 Linux 发行版上,您可以从一个包中安装它。

Ubuntu:忍者构建

openSUSE: 忍者

如果您的发行版找不到它,您必须下载它并将其位置添加到 path 环境变量中。

【讨论】:

感谢您的回答。我已经下载并构建了 ninja,并将其添加到我的 $PATH 变量中,但仍然看到此错误。如果这有什么不同,我正在使用 redhat 如果它真的在你的 PATH 中,你应该可以运行它。运行 echo $PATH 并确保文件夹 ninja 在那里。 也许你必须清除你的 CMake 缓存。只需删除构建目录中的 CMakeCache.txt。【参考方案2】:

我的解决方案:将“ninja-build”符号链接到“ninja”。

# ln -s /usr/bin/ninja /usr/bin/ninja-build

这仅适用于非常旧的 CMake 版本,我将在下面解释。

我已经将新的“ninja”二进制文件放入 /usr/bin 并检查它是否具有 0755 权限。我被难住了,直到我对生成器命令运行 strace。

# strace cmake -GNinja .. | grep -i ninja
access("ninja-build", R_OK)             = -1 ENOENT (No such file or directory)
access("/usr/local/sbin/ninja-build", R_OK) = -1 ENOENT (No such file or directory)
access("/usr/local/bin/ninja-build", R_OK) = -1 ENOENT (No such file or directory)
access("/sbin/ninja-build", R_OK)       = -1 ENOENT (No such file or directory)
access("/bin/ninja-build", R_OK)        = -1 ENOENT (No such file or directory)
access("/usr/sbin/ninja-build", R_OK)   = -1 ENOENT (No such file or directory)
access("/usr/bin/ninja-build", R_OK)    = -1 ENOENT (No such file or directory)
access("/opt/texlive/2016/bin/i386-linux/ninja-build", R_OK) = -1 ENOENT (No such file or directory)
access("/root/bin/ninja-build", R_OK)   = -1 ENOENT (No such file or directory)

它在寻找“ninja-build”,而不是“ninja”!

我在工作和家庭中,在 Windows 和 Linux 上广泛使用 CMake 和 Ninja。那么为什么我以前没有看到过这个错误呢?

嗯...在这种情况下,我使用的是非常旧的 CMake 版本,2.8.12 版。它太古老了,几乎变成了化石。所以大概是后来修复的 CMake 错误,或者 Ninja 项目在某个时候更改了二进制文件的名称。

【讨论】:

谢谢。 # ln -s /usr/bin/ninja /usr/sbin/ninja 为我工作。 从源代码构建 ninja 只会创建“ninja”二进制文件而不是 ninja-build。 CMake 的错误消息没有说明这一点,但您的回答解决了这个问题。谢谢。【参考方案3】:

如果ninja确实存在于$PATH中,但它仍然不起作用,你应该通过ls -l /PATH/TO/NINJA检查可执行文件的权限。确保其他人具有读取和执行权限(例如“-rwxr-xr-x”)。

另请参阅:0013910: Ninja generator initialization fails if /usr/bin/ninja is not world-readable

【讨论】:

它对我不起作用。最后,当我切换到 ubuntu 而不是 centos 时,一切正常......【参考方案4】:

你可能仍然受苦

CMake Error: CMake was unable to find a build program corresponding to "Ninja".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.

即使你已经拥有了:

ninja 放入您的路径中 ninja 具有适当权限的可执行文件 较新版本的 cmake**

那么可能是因为同时指定了-D CMAKE_MAKE_PROGRAM-G Ninja,但CMAKE_MAKE_PROGRAM的值无效(如空)

例如

带有 gradle 插件版本的 android Studio:

classpath 'com.android.tools.build:gradle:7.0.0-alpha03'

并且不使用 SDK Manager 提供的 cmake,作者:

将cmake可执行文件放入PATH环境变量中 将 ninja 可执行文件放入PATH 环境变量中 在模块的build.gradle 中指定等于PATH 中的cmake 版本,例如:
    externalNativeBuild 
        cmake 
            path "src/main/cpp/CMakeLists.txt"
            version "3.19.1" // this line
        
    

然后实际上 gradle 像这样调用 cmake:

cmake ^
-HD:\dev\android_cv_examples\HelloNDK7\app\src\main\cpp ^
-DCMAKE_SYSTEM_NAME=Android ^
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON ^
-DCMAKE_SYSTEM_VERSION=26 ^
-DANDROID_ABI=arm64-v8a ^
-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a ^
-DANDROID_NDK=D:\soft\Android\ndk-r21b ^
-DCMAKE_ANDROID_NDK=D:\soft\Android\ndk-r21b ^
-DCMAKE_TOOLCHAIN_FILE=D:\soft\Android\ndk-r21b\build\cmake\android.toolchain.cmake ^
-DCMAKE_MAKE_PROGRAM= ^
-DCMAKE_C_FLAGS= ^
-DCMAKE_CXX_FLAGS=-std=c++11 ^
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\dev\android_cv_examples\HelloNDK7\app\build\intermediates\cmake\debug\obj\arm64-v8a ^
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=D:\dev\android_cv_examples\HelloNDK7\app\build\intermediates\cmake\debug\obj\arm64-v8a ^
-DCMAKE_BUILD_TYPE=Debug ^
-BD:\dev\android_cv_examples\HelloNDK7\app\.cxx\cmake\debug\arm64-v8a ^
-GNinja ^
-DANDROID_PLATFORM=android-24

注意:如果删除之前的cmake构建缓存,并通过删除-DCMAKE_MAKE_PROGRAM来修改调用脚本,那么问题将得到解决。

【讨论】:

【参考方案5】:

通过将 CMake 升级到此答案中指定的最新版本来解决我的问题: https://askubuntu.com/a/865294/924090

这显然是 CMake 中的一个问题,现在已在最新版本中修复。更多信息在这里: https://gitlab.kitware.com/cmake/cmake/-/issues/21486

【讨论】:

我还必须升级 ninja 然后它才开始工作

以上是关于CMake 找不到 Ninja的主要内容,如果未能解决你的问题,请参考以下文章

我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。

我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。

QtCreator 找不到 cmake

使用ninja -C out/Release指令编译安卓Webrtc的SDK报错找不到android ndk处理方式

CMake 找不到 GLEW

CMake 找不到诅咒