c – 使用CMake为不同的构建类型创建构建树

我知道如何根据构建类型(发布,调试等)获取CMake输出库和bin,但是,为了减少(重新)编译时间,我想让CMake在不同的子文件夹中构建它们.

说我有这种树

|- CMakeLists.txt
|- build/
|- src/

如果我有debug,release和relwithdebinfo构建,我希望CMake自动创建一个像树一样的树

|- CMakeLists.txt
|- build/
|--- Debug/
|--- Release/
|--- RelWithDebInfo/
|- src/

等等.
这是可能的,如果是,我怎样才能实现我的目标?

我不想要“你应该从不同的文件夹中运行CMake”这样的答案,因为对于visual studio,这将导致多种解决方案等.
我希望能够从一个文件夹运行CMake,并让它自己处理子文件夹.

最佳答案 如果您只是单独使用CMake,它将自动为支持多种配置的生成器(如Visual Studio)执行此操作.

如果覆盖默认输出位置,则应通过支持generator expressions的* _OUTPUT_DIRECTORY目标属性执行此操作:

set_property(TARGET my_lib
    PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/$<CONFIG>/bin)

请注意$< CONFIG>生成器表达式,它将扩展为配置名称(Debug,Release等).

另请注意,如果您希望配置目录位于目录树的底部,您甚至可能不必显式提供生成器表达式:

This property specifies the directory into which library target files
should be built. The property value may use generator expressions.
Multi-configuration generators (VS, Xcode) append a per-configuration
subdirectory to the specified directory unless a generator expression
is used.

控制输出目录的三个属性是ARCHIVE_OUTPUT_DIRECTORY,LIBRARY_OUTPUT_DIRECTORY和RUNTIME_OUTPUT_DIRECTORY. This page解释了差异.

此外,您可能还希望使用pdb调试符号为构建设置PDB_OUTPUT_DIRECTORY.

现在,正如开头所提到的,所有这些仅适用于支持多种配置的生成器.对于像Makefile这样的单配置生成器,情况有所不同.在运行CMake时,您必须在一个特定的配置(通过在命令行或cmake-gui上设置CMAKE_BUILD_TYPE变量).如果要切换配置,则必须使用该变量的其他设置重新运行CMake.

这些生成器不支持同时具有多个配置.因此,如果您使用单一配置生成器并且您知道需要定期进行调试和发布版本,则最好为不同的配置保留单独的构建目录,并分别在每个配置中运行cmake.

点赞