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

Zou*_*uch 5 c++ cmake

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

说我有这种树

|- CMakeLists.txt
|- build/
|- src/
Run Code Online (Sandbox Code Playgroud)

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

|- CMakeLists.txt
|- build/
|--- Debug/
|--- Release/
|--- RelWithDebInfo/
|- src/
Run Code Online (Sandbox Code Playgroud)

等等。如果可以的话,这有可能实现我的目标吗?

我不希望出现诸如“您应该从不同的文件夹运行CMake”之类的答案,因为对于Visual Studio,这将导致多种解决方案,等等。我希望能够仅从一个文件夹运行CMake,并使它自己处理子文件夹。

Com*_*sMS 4

如果您只管 CMake,它会自动为支持多种配置的生成器(如 Visual Studio)执行此操作。

如果您覆盖默认输出位置,则应该通过*_OUTPUT_DIRECTORY支持生成器表达式的目标属性来执行此操作:

set_property(TARGET my_lib
    PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/$<CONFIG>/bin)
Run Code Online (Sandbox Code Playgroud)

请注意$<CONFIG>生成器表达式,它将扩展为配置的名称(调试、发布等)。

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

此属性指定应在其中构建库目标文件的目录。属性值可以使用生成器表达式。除非使用生成器表达式,否则多配置生成器(VS、Xcode)会将每个配置子目录附加到指定目录。

控制输出目录的三个属性是ARCHIVE_OUTPUT_DIRECTORYLIBRARY_OUTPUT_DIRECTORYRUNTIME_OUTPUT_DIRECTORY本页解释了其中的差异。

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

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

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