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

时间:2016-07-26 08:32:20

标签: c++ cmake

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

说我有这种树

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

如果我有调试,发布和relwithdebinfo构建,我希望CMake自动创建一个类似

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

  

此属性指定库目标文件所在的目录   应该建立。属性值可以使用生成器表达式。   多配置生成器(VS,Xcode)附加每个配置   子目录到指定的目录,除非生成器表达式   使用。

控制输出目录的三个属性是ARCHIVE_OUTPUT_DIRECTORYLIBRARY_OUTPUT_DIRECTORYRUNTIME_OUTPUT_DIRECTORYThis page解释了差异。

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

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

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