如何解决Conan2缓存库无运行路径及CTest适配问题?
解决Conan2缓存依赖的LD_LIBRARY_PATH通用配置方案
方案一:在CMakeLists.txt中配置(适配CTest)
因为CTest需要在构建目录运行,直接给测试用例注入LD_LIBRARY_PATH环境变量即可:
- 全局设置所有测试的环境变量
在CMakeLists.txt的顶层(比如enable_testing()之后)添加:
# 获取Conan2缓存中所有依赖的库路径 file(GLOB_RECURSE CONAN_LIB_PATHS "${CMAKE_BINARY_DIR}/conan/lib") list(REMOVE_DUPLICATES CONAN_LIB_PATHS) # 将路径转为LD_LIBRARY_PATH格式(Linux下用冒号分隔) string(REPLACE ";" ":" CONAN_LD_LIBRARY_PATH "${CONAN_LIB_PATHS}") # 全局设置测试的环境变量 set(CMAKE_TEST_ENVIRONMENT "LD_LIBRARY_PATH=${CONAN_LD_LIBRARY_PATH}:$ENV{LD_LIBRARY_PATH}")
- 针对单个测试用例设置
如果不需要全局设置,给特定测试用例单独配置:
add_test(NAME MyTest COMMAND my_test_binary) set_tests_properties(MyTest PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CONAN_LD_LIBRARY_PATH}:$ENV{LD_LIBRARY_PATH}" )
方案二:在conanfile.py中配置(通用构建/测试环境)
利用Conan的工具链或虚拟环境脚本统一管理环境变量:
- 生成virtualrunenv脚本
在conanfile.py中添加:
from conan import ConanFile from conan.tools.cmake import CMakeToolchain, CMake class MyProjectConan(ConanFile): settings = "os", "compiler", "build_type", "arch" requires = "openssl/3.2.1" # 示例依赖 generators = "CMakeDeps", "CMakeToolchain", "virtualrunenv" def build(self): cmake = CMake(self) cmake.configure() cmake.build()
运行conan install后,会生成run_env.sh(Linux)脚本,在构建/运行CTest前执行:
source run_env.sh cmake --build . ctest
- 在CMakeToolchain中直接注入变量
如果不想手动source脚本,在conanfile.py的generate方法中传递路径变量:
def generate(self): tc = CMakeToolchain(self) # 收集所有依赖的库路径 lib_paths = [] for dep in self.dependencies.values(): lib_paths.append(dep.cpp_info.libdirs[0]) ld_library_path = ":".join(lib_paths) # 将路径传递给CMake tc.variables["CONAN_LD_LIBRARY_PATH"] = ld_library_path tc.generate()
之后在CMakeLists.txt中复用这个变量,按照方案一的逻辑设置测试环境即可。
补充说明
- 上述方案会自动指向Conan2缓存中对应依赖的库目录,确保加载缓存内的正确版本,不会调用系统库。
- 若为Windows系统,只需把
LD_LIBRARY_PATH替换为PATH即可适配。
内容的提问来源于stack exchange,提问作者Patrick Fromberg
相关产品推荐
相关产品推荐

