使用CMake为不同的构建类型创建构建树
Create build tree for different build types with CMake
我知道如何根据构建类型(发布、调试等)让CMake输出库和bin,但是,为了减少(重新)编译时间,我希望CMake在不同的子文件夹中构建它们。
假设我有这种树
|- CMakeLists.txt
|- build/
|- src/
如果我有调试、发布和relwithdebinfo构建,我希望CMake自动为我创建一个类似的树
|- CMakeLists.txt
|- build/
|--- Debug/
|--- Release/
|--- RelWithDebInfo/
|- src/
等等。这可能吗?如果可能,我该如何实现我的目标?
我不想要像"你应该从不同的文件夹运行CMake"这样的答案,因为对于visualstudio来说,这会导致多个解决方案,等等。我希望能够只从一个文件夹运行CMake,并让它自己处理子文件夹。
如果不使用CMake,它将自动为支持多种配置的生成器(如Visual Studio)执行此操作。
如果覆盖默认输出位置,则应通过*_OUTPUT_DIRECTORY
目标属性进行覆盖,该属性支持生成器表达式:
set_property(TARGET my_lib
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/$<CONFIG>/bin)
注意$<CONFIG>
生成器表达式,它将扩展到配置的名称(Debug、Release等)
还要注意,如果您希望配置目录位于目录树的底部,您甚至可能不必显式地给出生成器表达式:
此属性指定库目标文件所在的目录应该建造。属性值可以使用生成器表达式。多配置生成器(VS、Xcode)为每个配置附加一个子目录到指定目录,除非生成器表达式使用。
控制输出目录的三个属性是ARCHIVE_OUTPUT_DIRECTORY
、LIBRARY_OUTPUT_DIRECTORY
和RUNTIME_OUTPUT_DIRECTORY
。这一页解释了区别。
此外,您可能还需要为带有pdb调试符号的构建设置PDB_OUTPUT_DIRECTORY
。
现在,正如开头所提到的,所有这些都只适用于支持多种配置的生成器。对于像Makefiles这样的单配置生成器,情况有所不同。在这里,当运行CMake时,您必须满足于一个特定的配置(通过在命令行或CMake gui上设置CMAKE_BUILD_TYPE
变量)。如果要切换配置,则必须使用该变量的不同设置重新运行CMake。
这些生成器不支持同时具有多个配置。因此,如果您使用单个配置生成器,并且您知道您需要定期调试和发布构建,那么最好为不同的配置保留单独的构建目录,并在每个目录中分别运行cmake。
- 文本冒险游戏 - 如何区分一种项目类型与另一种项目类型以及如何构建项目类/子类
- 创建一个类来访问和指定向量类型,并构建一个获取位置并为其分配区域的类
- 为什么C++数组索引值是有符号的,而不是围绕size_t类型构建的(或者我错了)
- 使用相同方法但不同成员类型构建类的最佳方法
- 如何构建程序以避免查询对象类型?
- 构建本身是共享_ptr类型的模板容器
- 在Visual Studio中,C++构建配置类型是Debug,Debug3D,DebugDLL4,DebugDLL9,
- 如何在类/类型中添加更多函数来构建 int、double、std::string 等
- 错误:在 mingw64 上构建 cmake+boost 项目时'GetSystemTimeAsFileTime'的类型冲突
- C++14 元编程:在编译/初始化时自动构建类型列表
- 致命错误LNK1112:通过 vcvarsall .bat x86 运行构建'X86'模块计算机类型'x64'与目标计算机类型冲突
- 在CMAKE中,如何以每个用户为基础更改构建类型的默认编译器标志
- 在makefile中更改构建规则以构建多种文件类型
- C 构建错误:类未命名类型
- 函数模板由用于构建不同类型的容器的分配器参数化
- 如何为动态类型语言构建编译器
- 使用共享库的后果dlopen另一个具有不同构建类型的共享库
- wxWidget配置:无法猜测构建类型
- 使用CMake为不同的构建类型创建构建树
- 使用 Cmake 的 RelWithDebInfo 作为默认构建类型