通过Conan引入yaml-cpp/0.6.3时CMake链接报错如何解决?
问题根因
你之前依赖的bullet、glm多为头文件-only库,无需额外链接即可正常编译,而yaml-cpp包含需编译的二进制实现,你当前的CMake配置缺少核心的链接步骤,同时也可能存在ABI不匹配、宏定义缺失的问题,可按以下步骤逐一排查修复:
修复步骤
- 第一步:补充依赖库链接配置
你用的conan_basic_setup()仅会自动配置头文件搜索路径、库文件搜索路径,所有依赖库的列表会存储在${CONAN_LIBS}变量中,需要显式将其链接到你的项目目标上,假设你的项目目标名为my-project,在add_executable(my-project src/MySourceFile.cpp)之后添加如下配置:
完成后重新生成CMake缓存并编译,90%以上的这类场景可直接解决。target_link_libraries(my-project ${CONAN_LIBS}) - 第二步:排查ABI不匹配问题
若补充链接步骤后仍报错,观察报错信息中带有abi:cxx11标识,说明你项目编译时开启了C++11 ABI,而Conan缓存中的yaml-cpp是按旧ABI编译的,可执行以下操作修复:- 执行命令更新Conan默认配置的ABI选项:
conan profile update settings.compiler.libcxx=libstdc++11 default- 清空本地已缓存的yaml-cpp包:
conan remove "yaml-cpp/0.6.3" -f- 重新执行
conan install安装依赖,再重新编译项目即可。
- 第三步:补充静态库宏定义(可选)
如果你使用的是静态编译的yaml-cpp,需要在项目中添加对应宏定义告知头文件使用静态库符号,在CMakeLists.txt中添加以下配置:add_compile_definitions(YAML_CPP_STATIC_DEFINE)
内容的提问来源于stack exchange,提问作者Sigma Octantis
相关产品推荐
相关产品推荐

