CMake中INTERFACE接口库添加依赖不传递到下游的问题咨询
问题解答
你的依赖定义方式确实有误,核心是错用了add_dependencies的语义:
add_dependencies的作用仅为指定构建顺序,保证fmt::fmt-header-only在mylib之前完成构建,不会传递任何编译、链接相关的属性,包括头文件搜索路径、编译选项、依赖库参数等。因此mylib的使用者test_exe完全感知不到fmt的存在,自然找不到对应的头文件。- 如果你需要将依赖的使用属性传递给下游目标,必须用
target_link_libraries声明依赖,即使是纯头文件的INTERFACE依赖也符合这个规则,现代CMake的target_link_libraries不止处理链接逻辑,还负责所有使用属性的传递。
修改后的mylib配置如下即可解决问题:
add_library(mylib INTERFACE ) # 替换原有的add_dependencies行,用INTERFACE参数指定该依赖要传递给下游 target_link_libraries(mylib INTERFACE fmt::fmt-header-only) target_compile_features(mylib INTERFACE cxx_std_20) target_include_directories(mylib INTERFACE .)
修改后无需再手动给test_exe添加fmt依赖,链接mylib时会自动继承fmt的头文件路径等全部配置。
内容的提问来源于stack exchange,提问作者fakedrake
相关产品推荐
相关产品推荐

