如何在同一Conan构建中为不同目标使用同一库的不同版本?
解决方案
你的需求完全可行,无需分开构建。下面是几种适配Conan 1.54的实现方案,优先推荐基于组件的方案,符合你“通过Conan目标变量自动管理依赖”的要求:
方案一:基于Conan组件(推荐)
核心思路是修改depA的Conan配方,将正常版和测试版封装为同一个包内的两个独立组件,让主项目和单元测试分别链接不同组件。
1. 修改depA的Conan Recipe
在depA的conanfile.py中,调整构建、打包和组件声明逻辑:
from conans import ConanFile, CMake class DepAConan(ConanFile): settings = "os", "compiler", "build_type", "arch" options = {"cxxtest": [True, False]} default_options = {"cxxtest": False} generators = "cmake" def build(self): cmake = CMake(self) # 传递cxxtest选项给CMake,编译两个版本的库(比如libdepA.a和libdepA_test.a) cmake.definitions["BUILD_TEST_VERSION"] = self.options.cxxtest cmake.configure() cmake.build() def package(self): # 打包正常版库 self.copy("libdepA.a", dst="lib", src="bin") # 若开启cxxtest,打包测试版库 if self.options.cxxtest: self.copy("libdepA_test.a", dst="lib", src="bin") # 打包公共头文件 self.copy("*.h", dst="include", src="include") def package_info(self): # 声明正常版组件 core_comp = self.cpp_info.components["core"] core_comp.libs = ["depA"] core_comp.includedirs = ["include"] # 声明测试版组件 test_comp = self.cpp_info.components["test"] test_comp.libs = ["depA_test"] test_comp.includedirs = ["include"] # 测试版依赖cxxtest时,自动关联 if self.options.cxxtest: test_comp.requires = ["cxxtest::cxxtest"]
2. 项目依赖配置
在项目根目录的conanfile.txt中,只需声明一次depA依赖,同时指定CMakeDeps生成器:
[requires] depA/2.1.0.0 depB/2.2.0.0 cxxtest/4.4 [generators] CMakeDeps CMakeToolchain
3. CMake中使用组件目标
无需手动指定依赖路径,直接通过Conan生成的组件目标链接:
# 主项目链接正常版组件 add_executable(main_app src/main.cpp) target_link_libraries(main_app PRIVATE depA::core depB::depB) # 单元测试链接测试版组件 add_executable(unit_tests test/test_case.cpp) target_link_libraries(unit_tests PRIVATE depA::test cxxtest::cxxtest)
执行一次conan install .即可完成所有依赖的安装,CMake会自动识别组件目标,实现主项目和测试分别使用不同版本的depA。
方案二:同一包的多配置共存(无需修改depA配方)
如果无法修改depA的配方,可以通过Conan的Profile和多目录安装实现:
1. 创建两个Profile文件
profile-main(主项目用,关闭cxxtest):
[options] depA:cxxtest=False
profile-test(测试用,开启cxxtest):
[options] depA:cxxtest=True
2. 分目录安装依赖
# 安装主项目依赖到conan-main目录 conan install . --profile:host=profile-main -s build_type=Release -o build/conan-main # 安装测试依赖到conan-test目录 conan install . --profile:host=profile-test -s build_type=Debug -o build/conan-test
3. CMake中引入不同依赖
通过设置不同的工具链文件,让主项目和测试子目录使用各自的依赖:
# 主项目配置 set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/build/conan-main/conan_toolchain.cmake) add_subdirectory(src) # 测试项目配置 unset(CMAKE_TOOLCHAIN_FILE) set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/build/conan-test/conan_toolchain.cmake) add_subdirectory(test)
这种方式需要两次conan install,但可以通过脚本自动化,同样无需分开构建整个项目。
方案三:虚拟环境临时调试(不推荐用于正式构建)
利用Conan的virtualenv生成器,分别生成主项目和测试的环境变量,在不同环境下构建:
# 主项目环境 conan install . -g virtualenv -o depA:cxxtest=False source activate.sh cmake --build build/main deactivate # 测试环境 conan install . -g virtualenv -o depA:cxxtest=True source activate.sh cmake --build build/test deactivate
内容的提问来源于stack exchange,提问作者RealFrogo
相关产品推荐
相关产品推荐

