CMake 找不到 Ninja

Ninja not found by CMake

我正在尝试使用 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 Ninja 生成器。为此,您需要 Ninja 在路上。在大多数 Linux 发行版中,您可以从包中安装它。

Ubuntu:忍者建造

openSUSE: 忍者

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

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

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

我的解决方案:符号链接 "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 项目在某个时候更改了二进制文件的名称。

你可能还在受苦

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 放入您的 PATH
  • ninja 具有适当权限的可执行文件
  • 较新版本的 cmake**

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

例如

Android Studio with gradle 插件版本:

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

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

  • 将 cmake 可执行文件放入 PATH 环境变量
  • 将 ninja 可执行文件放入 PATH 环境变量
  • 指定 cmake 版本等于 PATH 中的版本,在模块的 build.gradle 中,例如:
    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来修改调用脚本,那么问题将得到解决。

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

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

我正在使用 Mac 蒙特雷。我将 ninja 放入 /Applications/Users/USER/Applications 并确保 $PATH 指向这些目录,但没有成功。

我只让 CMake 发现 Ninja 通过自制软件购买安装它:

brew install ninja

继续安装它

apt install ninja-build