38

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

如何正确设置这些变量?

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

4

5 回答 5

50

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

Ubuntu:忍者构建

openSUSE : 忍者

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

于 2016-07-29T14:20:31.827 回答
11

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

于 2017-06-13T12:55:25.340 回答
5

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

另请参阅:0013910:如果 /usr/bin/ninja 不是世界可读的,则 Ninja 生成器初始化失败

于 2017-02-21T05:59:53.140 回答
2

你可能仍然受苦

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环境变量中
  • 将忍者可执行文件放在PATH环境变量中
  • 指定 cmake 版本等于PATH, 在 modules 中的版本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那么问题将得到解决。

于 2021-01-01T05:20:16.570 回答
1

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

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

于 2021-10-29T03:16:32.290 回答