使用CMake导入STATIC库yaml-cpp时出现异常问题
解决CMake导入yaml-cpp静态库的头文件查找与ar警告问题
我在导入yaml-cpp静态库时遇到两个问题:
- 直接用
add_library(yaml-cpp ${PROJECT_BINARY_DIR}/path/to/libyaml-cpp.a)关联库,虽然能找到头文件,但每次配置项目都会弹出ar: no archive members specified警告 - 用
STATIC IMPORTED方式导入库时,编译main.cpp会找不到yaml-cpp/yaml.h头文件
main.cpp代码:
#include "yaml-cpp/yaml.h"
问题原因
- 第一种写法属于错误用法:CMake会把传入的
.a文件当成普通源文件尝试归档,因此触发ar工具的警告,这不是正确导入预编译静态库的方式。 - 第二种写法缺失关键配置:仅指定了静态库的路径,但没有告诉CMake yaml-cpp头文件的位置,导致编译时无法找到头文件。
解决方案
给导入的yaml-cpp目标添加INTERFACE_INCLUDE_DIRECTORIES属性,指定头文件所在目录。修正后的CMakeLists.txt如下:
add_library(yaml-cpp STATIC IMPORTED) set_target_properties(yaml-cpp PROPERTIES IMPORTED_LOCATION ${PROJECT_BINARY_DIR}/path/to/libyaml-cpp.a # 替换为yaml-cpp头文件所在的实际目录 INTERFACE_INCLUDE_DIRECTORIES ${PROJECT_BINARY_DIR}/path/to/yaml-cpp/include ) target_link_libraries(main yaml-cpp)
说明
INTERFACE_INCLUDE_DIRECTORIES属性会将指定的头文件路径自动添加到依赖yaml-cpp的目标(比如main)的包含路径中,这样编译main.cpp时就能正确找到yaml-cpp/yaml.h,同时彻底避免第一种写法带来的ar警告。
内容的提问来源于stack exchange,提问作者timothy yohanan
相关产品推荐
相关产品推荐

