cmake:在CMakeLists.txt中选择一个生成器

Ted*_*Ted 29 cmake

我想强制CMake使用CMakeLists.txt中的"Unix Makefile" 生成器.

这是我现在使用的命令.

cmake -G "Unix Makefiles" .
Run Code Online (Sandbox Code Playgroud)

我希望它是这样的.

cmake .
Run Code Online (Sandbox Code Playgroud)

在安装了VC的窗口和自定义工具链上运行时.

我希望能够在CMakeLists.txt文件中设置生成器.

也许这样的事情.

set(CMAKE_GENERATOR "Unix Makefiles")
Run Code Online (Sandbox Code Playgroud)

Iva*_*van 19

这对我有用 -在项目目录中创建一个名为PreLoad.cmake的文件,其中包含:

set (CMAKE_GENERATOR "Unix Makefiles" CACHE INTERNAL "" FORCE)

  • 截至 2020/cmake 3.17 有更好的方法吗?这似乎与 -GNinja 的工作方式不同 (3认同)
  • 看起来"官方"cmake文档中没有记录`Preload.cmake`行为; 见[ticket 17231](https://gitlab.kitware.com/cmake/cmake/issues/17231) - 但很高兴知道! (2认同)

Mic*_*opp 9

在我看来,CMAKE_GENERATOR如果设置在变量中,变量设置得太晚了CMakeLists.txt.如果你使用(即使在开头CMakeLists.txt)

set(CMAKE_GENERATOR "Ninja")
message("generator is set to ${CMAKE_GENERATOR}")
Run Code Online (Sandbox Code Playgroud)

你可以在输出中看到类似的东西

% cmake ../source
-- The C compiler identification is GNU 4.9.2
...
-- Detecting CXX compile features - done
generator is set to Ninja
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/build
Run Code Online (Sandbox Code Playgroud)

因此,变量仅在生成过程的最后设置.如果你使用类似的东西

set(CMAKE_GENERATOR "Ninja" CACHE INTERNAL "" FORCE)
Run Code Online (Sandbox Code Playgroud)

in CMakeLists.txt,然后在第一次运行cmake ../source(没有-G)时使用默认生成器.但是,变量CMAKE_GENERATOR存储在缓存中.因此,如果您cmake ../source之后重新运行,它将使用CMAKE_GENERATOR缓存中变量中指定的生成器.

这当然不是最优雅的解决方案;-)也许使用一个批处理文件,它将实际cmake -G generator为用户执行...

  • 我希望他们能让用户在“CMakeLists.txt”中设置所有配置。如果您需要一个“.bat”来覆盖它,那有什么意义呢? (2认同)
  • 看起来 [Ivan's answer](https://gitlab.kitware.com/cmake/cmake/issues/17231) 做了一些与此非常接近的事情——该变量是在 cmake 配置文件中配置的,该文件是在实际的`CMakeLists 之前获取的.txt` 已加载。 (2认同)

小智 3

这不是我得到的,当我运行相同的命令时,cmake 将寻找 gcc 编译器/make 实用程序。如果 PATH 设置不正确,它将失败,并显示以下内容:

D:\Development\build>cmake -G "Unix Makefiles" ..\source
CMake 错误:CMake 无法找到与“Unix Makefiles”对应的构建程序。CMAKE_MAKE_PROGRAM 未设置。
  您可能需要选择不同的构建工具。
CMake 错误:错误需要未设置内部 CMake 变量,cmake 可能无法正确构建。
缺少的变量是:
CMAKE_C_COMPILER_ENV_VAR
CMake 错误:错误需要未设置内部 CMake 变量,cmake 可能无法正确构建。
缺少的变量是:
CMAKE_C_COMPILER
CMake 错误:找不到 cmake 模块文件:D:/Development/build/CMakeFiles/CMakeCCompiler.cmake
CMake 错误:错误需要未设置内部 CMake 变量,cmake 可能无法正确构建。
缺少的变量是:
CMAKE_CXX_COMPILER_ENV_VAR
CMake 错误:错误需要未设置内部 CMake 变量,cmake 可能无法正确构建。
缺少的变量是:
CMAKE_CXX_COMPILER
CMake 错误:找不到 cmake 模块文件:D:/Development/build/CMakeFiles/CMakeCXXCompiler.cmake
CMake 错误:启用语言后未设置 CMAKE_C_COMPILER
CMake 错误:启用语言后未设置 CMAKE_CXX_COMPILER
-- 配置不完整,出现错误!

当 gcc / mingw 在路径中时,一切正常。那么您能否提供有关 PATH 变量或 CMAKE 版本的更多信息?