我知道如何根据构建类型(发布,调试等)使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,并使它自己处理子文件夹。
如果您只管 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_DIRECTORY
、LIBRARY_OUTPUT_DIRECTORY
和RUNTIME_OUTPUT_DIRECTORY
。本页解释了其中的差异。
此外,您可能还想PDB_OUTPUT_DIRECTORY
使用 pdb 调试符号设置 for 构建。
现在,正如开头提到的,所有这一切仅适用于支持多种配置的生成器。对于像 Makefiles 这样的单配置生成器,情况有所不同。在这里,您必须在运行 CMake 时选择一种特定配置(通过设置CMAKE_BUILD_TYPE
在命令行或 cmake-gui 上设置变量)。如果要切换配置,则必须使用该变量的不同设置重新运行 CMake。
这些生成器不支持同时具有多个配置。因此,如果您使用单配置生成器并且知道您需要定期进行调试和发布构建,那么最好为不同的配置保留单独的构建目录,并在每个配置中分别运行 cmake。