【问题标题】:CMake & MinGW Compilation on Windows, without needing the -G "MinGW Makefiles" flagWindows 上的 CMake 和 MinGW 编译,不需要 -G "MinGW Makefiles" 标志
【发布时间】:2020-03-24 12:33:22
【问题描述】:

我想使用 CMake 和 MinGW 从 Windows PowerShell 命令行构建我的 C++ 应用程序。

当我使用这些命令以“正常方式”执行此操作时:

mkdir build
cd build
cmake ..
make

CMake 选择 V​​isual Studio 作为默认编译器,并且不会为我生成任何 Makefile。

我希望 CMake 使用 MinGW 作为默认编译器,并生成 Makefile。 当我运行这些命令时,它完全按照我想要的方式工作,添加 -G "MinGW Makefiles" 标志:

mkdir build
cd build
cmake .. -G "MinGW Makefiles"
make

如何在不添加 -G "MinGW Makefiles" 标志的情况下让 CMake 始终以这种方式运行?

我尝试在 Windows 中设置一个CMAKE_GENERATOR 环境变量,并将其指向“path\to\mingw\bin”、“path\to\mingw\bin\mingw32-make.exe”,以及一个读取为“MinGW Makefile”的字符串。

在运行 refreshenv 然后尝试再次运行 cmake .. 后,这些对我都不起作用。

有人知道这是否是用于指定 CMake 的默认行为的正确环境变量吗?如果是,我应该使用什么值?

【问题讨论】:

  • 只需将 MinGW 添加到 PATH 变量中,然后试试这个find_program(CMAKE_CXX_COMPILER NAMES $ENV{CXX} g++ PATHS ENV PATH NO_DEFAULT_PATH)
  • 根据that answer,没有变量会影响CMake默认使用的generator。但是根据bugreport,事情可能会改变......在未来。
  • 我认为你的问题是错误的......CMakeFiles.txt 应该尽可能地不知道编译器......这允许你为不同的生成器创建同一个项目。跨度>
  • 我认为你不明白我的问题。你说:“CMakeFiles.txt 应该尽可能地不知道编译器......这允许你为不同的生成器使用同一个项目。”我不是在询问在项目级别上修改 CMake 的行为。我问的是如何在所有使用 CMake 的项目中更改我自己机器上的默认行为,而不影响其他机器上的行为。我没有提到CMakeFiles.txt
  • 创建别名?一个旧的 doskey 宏或者一个批处理文件 cmake.bat,它转发所有参数并首先注入生成器?

标签: c++ makefile cmake


【解决方案1】:

如何在不添加 -G "MinGW Makefiles" 标志的情况下让 CMake 始终以这种方式运行?

您不能,在迄今为止发布的任何 CMake 版本中都不能。 CMake 在开始评估任何CMakeLists.txt 文件之前选择一个生成器。默认情况下,它会根据运行时平台和可用工具集选择生成器,而命令行选项是目前影响或覆盖 CMake 选择生成器的唯一可用方式。

在 cmets 中,@Tsyvarev 指出 an open CMake issue report 要求与您要求的功能完全相同。相关评论线程提供了更多详细信息,最后一条评论是今年早些时候。我猜想最终 CMake 将添加对通过环境变量指定生成器的支持,但目前,您的 -G 选项是唯一可用的选择。如果您想节省击键并降低拼写错误的风险,您可以考虑编写脚本。

【讨论】:

    【解决方案2】:

    cmake 在 Windows 上默认使用 Visual Studio 生成器 MinGW(即使没有 Visual Studio!),这是真正令人讨厌的问题(Cygwin 不受影响)。

    我们只需要解决MinGWMinGW 最可靠的钩子是什么?我认为MSYSTEM 是非常流行的环境变量,它将始终为MinGW 定义。

    您可以将PreLoad.cmake放在项目根目录下,内容如下:

    if (NOT "$ENV{MSYSTEM}" STREQUAL "" AND "$ENV{VisualStudioVersion}" STREQUAL "")
      find_program (CMAKE_NINJA_BINARY NAMES "ninja")
      if (CMAKE_NINJA_BINARY)
        set (
          CMAKE_GENERATOR "Ninja"
          CACHE INTERNAL "Cmake generator"
        )
        return ()
      endif ()
    
      find_program (CMAKE_MAKE_BINARY NAMES "gmake" "make")
      if (CMAKE_MAKE_BINARY)
        set (
          CMAKE_GENERATOR "Unix Makefiles"
          CACHE INTERNAL "Cmake generator"
        )
        return ()
      endif ()
    endif ()
    

    不幸的是,这个解决方案并不通用:

    MSYSTEM=MINGW64 cmake -G "Unix Makefiles" ..
    
        CMake Error: Error: generator : Unix Makefiles
        Does not match the generator used previously: Ninja
        Either remove the CMakeCache.txt file and CMakeFiles directory or choose a different binary directory.
    

    如果您在PreLoad.cmake 中设置CMAKE_GENERATOR,那么您将失去使用-G cmake 选项的能力。如果您不需要此选项,则此解决方案就可以了。

    PS 不能以CMAKE_GENERATOR 或其他选项访问PreLoad.cmake 内的-G 选项值。所以不可能添加像NOT DEFINED CMAKE_GENERATOR 这样的保护案例来检查是否使用-G 选项显式提供了生成器。

    【讨论】:

      猜你喜欢
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      相关资源
      最近更新 更多