您可能希望将调试和发布工件打包在同一个包中,以便可以从ide (如Visual Studio) 中使用它。这将从IDE更改调试/发布配置,而无需在命令行中指定它。这种类型的包可以包含用于不同配置的不同工件,并且可以用于在同一包中包括库的发行版和调试版。
    N configs -> 1 package - 图1

    :::info Note
    在示例存储库中可以找到以下代码的完整工作示例:https://github.com/conan-io/examples

    1. $ git clone https://github.com/conan-io/examples.git
    2. $ cd features/multi_config
    3. $ conan create . user/channel

    :::

    创建多配置调试/发布包很简单
    第一步是从设置中删除build_type。它将不是输入设置,并且生成的包将始终包含调试和释放工件。
    Visual Studio运行时对于调试和发布 (MDd或MD) 而言是不同的,并且使用默认运行时 (MD/MDd) 进行设置。如果这满足您的需要,我们建议在configure() 方法中删除编译器.Ru ntime子设置:

    1. class HelloConan(ConanFile):
    2. # build_type has been omitted. It is not an input setting.
    3. settings = "os", "compiler", "arch"
    4. generators = "cmake"
    5. # Remove runtime and use always default (MD/MDd)
    6. def configure(self):
    7. if self.settings.compiler == "Visual Studio":
    8. del self.settings.compiler.runtime
    9. def build(self):
    10. cmake_release = CMake(self, build_type="Debug")
    11. cmake_release.configure()
    12. cmake_release.build()
    13. cmake_debug = CMake(self, build_type="Release")
    14. cmake_debug.configure()
    15. cmake_debug.build()

    在此示例中,二进制文件将在CMake语法中使用后缀进行区分,因此我们必须将此信息添加到package_info函数中提供给使用者的数据中:

    1. set_target_properties(mylibrary PROPERTIES DEBUG_POSTFIX _d)

    这样的包可以将其信息定义为:

    1. def package_info(self):
    2. self.cpp_info.release.libs = ["mylibrary"]
    3. self.cpp_info.debug.libs = ["mylibrary_d"]

    这将转换为CMake变量:

    1. set(CONAN_LIBS_MYPKG_DEBUG mylibrary_d)
    2. set(CONAN_LIBS_MYPKG_RELEASE mylibrary)
    3. # ...
    4. set(CONAN_LIBS_DEBUG mylibrary_d ${CONAN_LIBS_DEBUG})
    5. set(CONAN_LIBS_RELEASE mylibrary ${CONAN_LIBS_RELEASE})

    这些变量将由conan_basic_setup() 助手正确地应用于每个配置。
    在这种情况下,您仍然可以使用常规变量而不是特定于配置的变量。例如,当默认设置为包含时,调试和发布时,包含目录保持不变。这些通用变量将应用于所有配置。

    :::info Important
    上面的代码假定程序包将始终使用默认的Visual Studio运行时(MD/ MDd)。 要使软件包可配置为支持与VS运行时库的静态(MT)/动态(MD)链接,可以执行以下操作:

    • 保持compile.runtime设置,例如 不要实现configure()方法将其删除。
    • 不要让CMake帮助程序定义CONAN_LINK_RUNTIME变量来定义运行时,而应定义CONAN_LINK_RUNTIME_MULTI
    • CMakeLists.txt中,使用CONAN_LINK_RUNTIME_MULTI变量正确设置调试和释放标志的运行时。
    • 为 MD/MDd 和 MT/MTd 编写单独的package_id()方法,以定义要构建的程序包。

    所有这些步骤已经在仓库https://github.com/conan-io/examples/tree/master/features/multi_config中进行了编码,并注释为“替代2”。

    :::

    :::info Note
    多配置变量到生成器的自动转换当前在cmakevisual_studiotxtcmake_find_package生成器(以及相应的_multi实现)中实现。
    如果您想在其他构建系统中获得支持,请打开GitHub问题。 :::