【问题标题】:How to write CMakeLists.txt with NOT using 'MSBuild.exe' on windows? [duplicate]如何在 Windows 上不使用“MSBuild.exe”编写 CMakeLists.txt? [复制]
【发布时间】:2019-09-26 01:28:09
【问题描述】:

我正在尝试编写 CMakeLists.txt 来构建 仅限自定义目标 项目。

也就是说,它不适用于通常的 C/C++ 项目;所有构建配方均使用ADD_CUSTOM_COMMAND() 和ADD_CUSTOM_TARGET() 提供。我使用 CMake 的原因是管理构建目标内容之间的依赖关系并利用增量构建的优势。

问题是,当我在 Windows cmd.exe 上执行 cmake CMakeLists.txt 时,它会尝试查找 Windows SDK 或 MSBuild.exe——在项目中构建目标时从来不需要这些。

cmd.exe> cmake CMakeLists.txt
-- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.17134.
CMake Error at CMakeLists.txt:6 (PROJECT):
  Failed to run MSBuild Command:

    MSBuild.exe

  to get the value of VCTargetsPath:

    Cannot find file

-- Configuring incomplete, errors occurred!
See also "CMakeFiles/CMakeOutput.log"

CMakeLists.txt的标头是:

cmake_minimum_required ( VERSION 3.0 )
set ( CMAKE_GENERATOR "Unix Makefile" )
set ( CMAKE_VERBOSE_MAKEFILE true )

# Project name
project ( "awesome-project" NONE )  # <language>=NONE for skipping compiler check

...

正如我上面提到的,构建目标的所有配方都在CMakeLists.txt 中提供;既不需要 Windows SDK 也不需要 Visual Studio。

我认为有一些 CMake 指令可以跳过 MSBuild 的调用,但我找不到它。这种情况下怎么写CMakeLists.txt?

【问题讨论】:

  • CMake 使用MSBuild.exe 不是用于编译,而是用于building 项目 - 它会检测依赖文件中的更改并运行您对应的命令在add_custom_target 和add_custom_command 中使用。问题是 CMake 只是一个 configuration 工具,而不是一个 build 工具。用于构建的工具是根据generator 选择的,这是您无法在CMakeLists.txt 中设置的一些内容之一。构建工具MSBuild.exe对应Visual Studio生成器。

标签: cmake cross-platform


【解决方案1】:

正如答案here 建议的那样,在第一次运行CMake 时,在CMake 文件中设置CMAKE_GENERATOR 变量没有效果。如果没有通过命令行或环境变量提供生成器,CMake 将在第一次尝试时使用默认生成器。所以尝试添加命令行 option -G 来指定生成器,如下所示:

cmake -G "Unix Makefiles" .

然后,在随后的 CMake 运行中,生成器设置将被缓存,您不再需要提供 -G 生成器选项。

附带说明,您可以简单地提供顶级CMakeLists.txt 文件的路径。因此,如果它在当前目录中,您可以使用. 作为路径。

【讨论】:

  • 我不知道这个问题与生成器选项有关。谢谢!
【解决方案2】:

文档非常明确The value of this variable should never be modified by project code. A generator may be selected via the cmake(1) -G option, interactively in cmake-gui(1), or via the CMAKE_GENERATOR environment variable.

您始终可以使用适当的选项创建运行 CMake 的 CMake 脚本来创建项目。

您可能希望继续关注CMAKE_VERBOSE_MAKEFILE,因为This variable is a cache entry initialized (to FALSE) by the project() command. 如果它不像您的脚本中显示的那样工作,我不会感到惊讶。相反,您可能必须在命令行上添加一个 -D 选项来设置它。 https://bytefreaks.net/programming-2/make-building-with-cmake-verbose

【讨论】:

    猜你喜欢
    • 2020-09-08
    • 2022-08-15
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2013-03-16
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多