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‘: 系统找不到指定的文件。