【问题标题】:cmake command line optioncmake 命令行选项
【发布时间】:2013-10-24 11:34:46
【问题描述】:

我是 VS 开发和 Cmake 的新手。 我已经使用 CMake-GUI 生成了一个 Visual Studio 解决方案,并且能够成功构建它。

但是,我们的代码现在已经到了可以最终构建和链接到二进制文件的阶段。由于多人签入代码,我们希望每晚进行一次构建,因此我正在考虑为此编写一个批处理文件。

但是,我正在尝试从命令行调用 cmake,但遇到了问题。

在cmake-gui中,为了配置,我提供了两个值 我的源代码路径 生成二进制文件的路径

但是,当我尝试通过命令行运行相同的命令时(使用以下命令)

cmake -G "NMake Makefiles" -D CMAKE_SOURCE_DIR="D:\source_code" -D CMAKE_BINARY_DIR="D:\source_code\build\gen\host"

CMake 抛出错误:源目录“D:\”是文件而不是目录。

我也尝试了以下变体,但没有任何运气

cmake -G "NMake Makefiles" -D PROJECT_SOURCE_DIR="D:\source_code" -D PROJECT_BINARY_DIR="D:\source_code\build\gen

谁能指导我正确的语法。

提前致谢

【问题讨论】:

  • 我猜这是因为反斜杠在 CMake 中被作为转义字符处理。您可以尝试将反斜杠加倍:\` or working with slashes /`

标签: c visual-studio cmake


【解决方案1】:

您不应该尝试在命令行上设置任何这些变量。它们由 CMake 第一次读取 CMakeLists.txt 时自动设置。

相反,您应该在二进制目录中运行 CMake 命令,并将路径传递到包含顶级 CMakeLists.txt 的目录。所以像:

cd D:\source_code\build\gen\host
cmake -G"NMake Makefiles" D:\source_code

顺便说一句,CMake 的命令行解析不是很好(例如,参见 this answer)。我建议避免在 -D 参数之后留下空格。

【讨论】:

  • 但是当我运行 Cmake-GUI 时,我提供了“源代码在哪里”和“二进制文件在哪里”值? cmake 如何知道我是否使用命令行?
  • 二进制目录隐含在您执行 CMake 命令的 where 中。源目录作为参数传递给 CMake 命令 - 在本例中为 D:\source_code
  • 此外,一旦 CMake 第一次运行,它会在构建文件夹根目录中创建一个名为 CMakeCache.txt 的缓存文件。 CMake 的后续运行只能给出此构建根目录的路径。因此,如果您重新运行 CMake 并且仍在构建根目录中,您可以执行 cmake .(之前的所有 -D 参数都已缓存,无需再次设置,除非您想更改其中任何一个)。跨度>
  • 很遗憾,您的建议不起作用。如果我按照您建议的方式运行 cmake,它会引发错误“CMake 无法找到与 NMake Makefile 对应的构建程序”。之前,我运行了这个命令,我已经运行了 vcvars32.bat,可以确认 cl 可用。唯一有效的是,如果我首先通过 gui 生成缓存文件。有什么建议吗?
  • 可能是错字?您的错误消息提到“NMake Makefile”,但生成器应该是“NMake Makefiles”(带有“s”)。
【解决方案2】:

试试这个

去掉-D和参数之间的空格

 cmake -G "NMake Makefiles" -DCMAKE_SOURCE_DIR="D:\source_code" -DCMAKE_BINARY_DIR="D:\source_code\build\gen\host"

【讨论】:

    【解决方案3】:

    在我的项目中,我们使用了 CMake-GUI。但我创建了一个 shell 脚本文件以避免重复填写条目。

    示例要点如下。

    cd <DIRECTORY_TO_BUILD> && <CMAKE-INSTALLATION-PATH>/bin/cmake.exe --build= "<BUILDSOURCE-PATH> -DQt5Widgets_DIR:PATH=C:/Qt/5.12.0/msvc2017/lib/cmake/Qt5Widgets
    

    我从 cd 开始,否则脚本将创建运行脚本的构建文件夹。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-25
      • 2015-11-17
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      相关资源
      最近更新 更多