【问题标题】:'cmake' is not recognised as an internal or external command'cmake' 未被识别为内部或外部命令
【发布时间】:2013-10-11 03:29:16
【问题描述】:

我正在尝试在 Visual Studio 10 中为 esys-particle-win 运行 cmake。

我的 cmake 之路:C:\Program Files (x86)\CMake 2.8\bin\cmake.exe

我的 esys-particle-win 之路:C:\esys-particle-win\trunk\buildvs2010\mkvs10.bat

我在 Visual Studio 2010 的管理员命令提示符中输入的命令是:

cd c:\esys-particle-win\trunk\buildvs2010
mkvs10.bat

我收到了这个错误:

'cmake' is not recognized as an internal or external command

mkvs10.bat的内容:

cmake .. -G "Visual Studio 10" -G "NMake Makefiles"

谁能告诉我哪里错了?我不懂计算机编程。我按照本网站第 2.3.1 节中提到的说明进行操作:`

https://launchpadlibrarian.net/139659869/esys-particle-win-%28v2.1%29-build-instructions.pdf

` 任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: c++ visual-studio cmake


    【解决方案1】:

    错误信息意味着它找不到 cmake。
    您可以从提示中将其位置添加到您的路径中,如下所示:

    set PATH="C:\Program Files (x86)\CMake 2.8\bin\";%PATH%
    

    【讨论】:

    • 你说 cmake - 它在当前目录中查找,找不到它,所以在 PATH 中的每个目录下都找不到它,所以抱怨。 set PATH=whatever 将 PATH 设置为任何值。 %PATH% 表示当前是什么,因此 thais 将 cmake 的路径添加到其他所有内容。当心 - 它只能是有限的长度。
    • 请注意,Windows 上的 PATH 环境变量中不需要引号。所以上面在 Windows 上的例子看起来像: set PATH=C:\Program Files (x86)\CMake 2.8\bin\;%PATH% 我有同样的问题,并在这篇文章中解决了它:stackoverflow.com/questions/32857449/…
    • 如果是 64 位,则路径为 C:\Program Files\CMake\bin。您还可以通过转到系统属性(右键单击计算机--> 属性--> 高级系统设置)--> 高级选项卡--> 环境变量...按钮来更新 PATH 变量。
    【解决方案2】:

    正如上面提到的@doctorlove,错误信息意味着它找不到Cmake。

    请注意,Windows 上的 PATH 环境变量中不需要引号。所以上面的例子在 Windows 上看起来像:

    set PATH=C:\Program Files (x86)\CMake 2.8\bin\;%PATH% 
    

    我也有同样的问题,and resolved it in this post.

    【讨论】:

      【解决方案3】:

      请注意,如果您通过 Chocolatey 安装 cmake,您可能忽略了添加参数 --installargs 'ADD_CMAKE_TO_PATH=System'。如果您已经 choco 安装了没有该参数的 cmake,则通过 --force 重新安装不会尊重新参数:您需要卸载然后安装。特别是choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'

      【讨论】:

        【解决方案4】:

        自从我在 D:\Program Files 中安装 CMake 后,我遇到了同样的问题,我通过手动添加路径变量来修复它。

        1. 打开控制面板
        2. 转到系统和安全,然后转到系统。 How it looks like in after step 2
        3. 在这里选择高级系统设置,会出现一个对话框。 The dialogue box
        4. 现在转到环境变量。
        5. 现在选择路径,然后点击编辑 After the 4th Step
        6. 这里在许多现有路径的底部添加一条新路径。
        7. 就我而言,我在D:\Program Files\ 中安装了CMake
        8. 所以我需要添加路径 D:\Program Files\CMake\bin。您应该将路径复制到您的 CMake 文件夹并在末尾添加 \bin
        9. 现在打开你必须重新启动命令提示符才能看到更改。

        【讨论】:

          【解决方案5】:

          我正在尝试使用我最近下载的 Visual Studio Community 2017 构建一个项目,但我的路径上没有 CMake。

          即使在我获得了 VCVars 之后,它也没有帮助:"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64

          虽然我不确定它是否有我需要的生成器(?),而不是单独安装一个可能适用于这些答案的副本,我在安装目录中找到了一个,它有与我使用的指南中的路径不同。

          这是我的调用行:"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" -G "Visual Studio 15 2017" -DCMAKE_BUILD_TYPE=%CMAKE_BUILD_TYPE% ..

          【讨论】:

            【解决方案6】:

            我发现 CMake 是:

              C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin
            

            如上所述,我通过 hrithik singla 将它添加到用户路径中,并且 node-gyp 工作,特别是 "npm install"。我预计它会在未来再次改变。所以我找到它的方法是让 Windows 资源管理器搜索 "C:\Program Files (x86)\Microsoft Visual Studio\2019",然后挖掘 CMake 路径的结果。可能其他开发工具会将 CMake 安装到不同的文件夹中。

            【讨论】:

              【解决方案7】:

              有几个问题可能会导致这种情况。它主要与Windows相关。这更多是在 cmake 方面,但它解决了在 Windows 中使用 CMake 时可能遇到的一些特定于 Windows 的问题。这在我脑海中很新鲜,并且突然出现,所以我将把它放在这里。我们开始吧。

              1.如果路径中有空格,CMake 将分隔一个变量以列出。

              如果您从 CMake 中调用另一个 CMake 实例,发送程序文件路径将对这些字符串进行切片,并将您的变量分成 3 项列表。空格将被分号分隔符替换。

                  set(CMAKE_EXE C:\Program Files (x86)\CMake\bin\cmake.exe)
              
              "C:\Program;Files;(x86)\CMake\bin\cmake.exe  <- CMAKE_EXE is now a 3 item list separated by ; "
                  
                  list(LENGTH ${CMAKE_EXE} count)
                  message("CMAKE_EXE has ${count} items") "-> displays 3"
              

              在 Windows 上,所有路径变量都应该用引号括起来,以推断它们是 1 个单字符串变量。不仅适用于 cmake,还适用于批处理脚本、基本命令行等。

                  set(CMAKE_EXE "C:/Program Files (x86)/CMake/bin/cmake.exe")
              

              现在,每当您引用 CMAKE_EXE 时,您都需要始终将其括在引号中,因为 cmake 会再次将其分解为列表。

                 execute_command(COMMAND cmd /c ${CMAKE_EXE} -P myScript.cmake)  <-- BAD
                 execute_command(COMMAND cmd /c "${CMAKE_EXE}" -P myScript.cmake) <- GOOD
              

              养成在你引用的路径周围引用引号的习惯。

              2。远离 Windows 反斜杠!
              默认情况下,Windows 使用反斜杠作为路径分隔符,这是大多数编码语言(包括 CMake)中的转义序列。只需发送窗口/正斜杠即可。这消除了您在字符串文字中加倍转义字符以匹配路径时遇到的任何麻烦。 \
              请记住,Windows 总是会尝试为您提供 \ 格式的路径。 Windows 喜欢在某些地方使用反斜杠,例如环境路径和设置文件,而 cmake 喜欢正斜杠。您有时需要在不同格式之间进行转换。 使用类似这样的东西将路径转换为更加跨平台兼容。您可以在现有变量上替换“就地”。

              "CMAKE_EXE = C:\Program Files (x86)\CMake\bin\cmake.exe <- value before"
              
              string(REPLACE "\\" "/" CMAKE_EXE "${CMAKE_EXE}")   "<- notice the quotes again"
              
              "CMAKE_EXE = C:/Program Files (x86)/CMake/bin/cmake.exe <- value after"
              

              看看这些用于进行路径转换的 CMake 函数。 https://cmake.org/cmake/help/latest/command/file.html#to-native-path

              3.有时,Windows 将不带引号的路径解释为 8.3SFN (8DOT3) 格式

              8.3 filename 在 MSDOS 和 Windows 95 时代,我们处理的是 FAT 文件系统和 8.3Short Filenames。命令提示符不能处理超过 8 个字符的文件名,因此我们需要一种在支持引号字符串之前访问长 windows 文件名的方法。 8 个字符 + 3 个用于扩展名。而且大多数系统今天仍然支持 8.3。这是一个例子。

              C:\Program Files\Windows\System32\Calc.exe    <- \Program Files\ is 13 characters
              

              为了将 CD 放入这个不带引号的路径,你必须使用短路径。像这样。

              CD C:\Progra~1\Windows\System32\Calc.exe  <-- *Progra~1 is 8 characters, 1st occurrence.* 
              

              您只需将文件或文件夹名称分解为 6 ​​个字符,加上 ~n (n=occurrence)

              如果我们有一个 C:\Program Files (x86) 路径,那么就像我们今天所做的那样,它将是前 6 个字符匹配的第二个路径,并且都超过了 8 个字符。 p>

              C:\Program Files           becomes ->  C:\Progra~1\
              C:\Program Files (x86)     becomes ->  C:\Progra~2\
              C:\MyLongFilename.txt      becomes ->  C:\MyLong~1\
              

              每当我无法通过无法发送转义序列或引号的软件访问完整长度的文件系统时,我不得不求助于使用 8.3 短文件名来访问某些路径。在某些 Windows 机器上,引号甚至不起作用,在主机上启用它们将是一个漫长的过程。发生这种情况时,这是一个很好的解决方法。

              获取短路径(通过发送到命令提示符)

              C:\ for %A in ("C:\Program Files (x86)\CMake\bin\cmake.exe") do @echo %~sA
              

              会生成 C:\Progra~1 供你使用

              或者,通过将路径作为参数发送到批处理文件来获取短路径。

              ::getShortPath.bat
              @ECHO OFF
              echo %~s1
              

              使用:-> getShortPath.bat "C:\Program Files (x86)\CMake\bin\cmake.exe"

              总结一下,这里有三个示例,说明当 Windows 路径无法解析时,CMake 背后的后台可能会发生什么。

              不在路径周围使用引号

              使用引号有效。但有时如果 stdio >> 运行多个进程,您可能会丢失引号。在这种情况下,您需要将它们作为转义序列发送"\"C:/Program Files (x86)/CMake/bin/cmake.exe\""

              4.路径和命令行参数需要是相互独立的变量或实例。 从 CMake 发送参数时,您确实希望它们是与路径变量分开的变量。 Set(CMAKE_EXE "C:\Program Files (x86)\CMake\bin\cmake.exe --version") 将不起作用。只有带有空格的路径和参数需要用引号括起来。

              set(CMAKE_EXE "C:\Program Files (x86)\CMake\bin\cmake.exe" --version --trace "C:\My Soure Dir")


              把它们放在一起


              如果有人像我过去一样遇到 Windows/CMake 路径问题,请彻底研究此代码,直到您完全理解它。所有报价位置。当您了解引用的内容和未引用的内容以及原因时,从长远来看应该会有很大帮助。

              set(CMAKE_EXE "C:\Program Files (x86)\CMake\cmake.exe" CACHE INTERNAL "") <- make it a global variable.
              
              set(ARGUMENTS --version --trace)
              set(MyStringWithQuotesIncluded "\"This String wants it's quotes included\"")
              set(MyCMakeLists "C:\MyApp\ProjectDirectory")
              set(BuildHere "C:\MyBuilds\MyOSProject\bin")
              
              set(FULL_COMMAND "${CMAKE_EXE}" ${ARGUMENTS} -DSTRING_VARIABLE="${MyStringWithQuotesIncluded}" -S "${MyCMakeLists}" -B "${BuildHere}")
              
              execute_command(COMMAND cmd /c ${FULL_COMMAND} WORKING_DIRECTORY "${BuildHere}")
              

              当我第一次开始使用通过 CMake 层的 Windows 路径时,我遇到了很多问题。我希望这可以帮助某人在未来避免所有这些。

              【讨论】:

                【解决方案8】:

                将路径设置为 C:\Program Files\CMake\bin

                【讨论】:

                • 请在您的回答中附上解释。此外,这个答案已经多次给出。
                猜你喜欢
                • 1970-01-01
                • 2014-04-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-10-31
                • 2013-10-06
                • 2013-01-25
                • 2016-10-01
                相关资源
                最近更新 更多