您可能希望将调试和发布工件打包在同一个包中,以便可以从ide (如Visual Studio) 中使用它。这将从IDE更改调试/发布配置,而无需在命令行中指定它。这种类型的包可以包含用于不同配置的不同工件,并且可以用于在同一包中包括库的发行版和调试版。
:::info
Note
在示例存储库中可以找到以下代码的完整工作示例:https://github.com/conan-io/examples
$ git clone https://github.com/conan-io/examples.git
$ cd features/multi_config
$ conan create . user/channel
:::
创建多配置调试/发布包很简单
第一步是从设置中删除build_type。它将不是输入设置,并且生成的包将始终包含调试和释放工件。
Visual Studio运行时对于调试和发布 (MDd或MD) 而言是不同的,并且使用默认运行时 (MD/MDd) 进行设置。如果这满足您的需要,我们建议在configure() 方法中删除编译器.Ru ntime子设置:
class HelloConan(ConanFile):
# build_type has been omitted. It is not an input setting.
settings = "os", "compiler", "arch"
generators = "cmake"
# Remove runtime and use always default (MD/MDd)
def configure(self):
if self.settings.compiler == "Visual Studio":
del self.settings.compiler.runtime
def build(self):
cmake_release = CMake(self, build_type="Debug")
cmake_release.configure()
cmake_release.build()
cmake_debug = CMake(self, build_type="Release")
cmake_debug.configure()
cmake_debug.build()
在此示例中,二进制文件将在CMake语法中使用后缀进行区分,因此我们必须将此信息添加到package_info函数中提供给使用者的数据中:
set_target_properties(mylibrary PROPERTIES DEBUG_POSTFIX _d)
这样的包可以将其信息定义为:
def package_info(self):
self.cpp_info.release.libs = ["mylibrary"]
self.cpp_info.debug.libs = ["mylibrary_d"]
这将转换为CMake变量:
set(CONAN_LIBS_MYPKG_DEBUG mylibrary_d)
set(CONAN_LIBS_MYPKG_RELEASE mylibrary)
# ...
set(CONAN_LIBS_DEBUG mylibrary_d ${CONAN_LIBS_DEBUG})
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
多配置变量到生成器的自动转换当前在cmake
,visual_studio
,txt
和cmake_find_package
生成器(以及相应的_multi
实现)中实现。
如果您想在其他构建系统中获得支持,请打开GitHub问题。
:::