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
我正在尝试使用 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