CMake项目拆分第三方静态库引入配置后编译失败如何解决
问题原因
- CMake 中
IMPORTED类型的库目标默认作用域仅为 当前CMakeLists.txt所在目录及其子目录,你在${CMAKE_SOURCE_DIR}/ext_lib/CMakeLists.txt中定义的external_lib目标,上层目录以及和ext_lib平级的其他子项目目录均不可见该目标。 - 当 CMake 无法匹配到已定义的目标时,会默认将
target_link_libraries中填写的名称识别为外部系统库名,直接生成-lexternal_lib的链接参数,自然不会携带你提前配置的头文件路径、库路径等属性,也就会出现头文件找不到、链接路径错误的问题。
解决方法
最简单的方案是修改ext_lib目录下的CMakeLists.txt,为导入目标添加GLOBAL参数,将其作用域提升到全局可见:
project(external_lib) message("External lib CMakelists.txt entered") # 添加GLOBAL参数,将导入目标的作用域提升到全局 add_library(external_lib STATIC IMPORTED GLOBAL) set_target_properties(external_lib PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/ext_lib/libext.a INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/ext_lib/include" )
修改后重新生成构建配置即可,其他子项目可以正常识别external_lib目标,自动继承其配置的头文件路径、库路径属性。
内容的提问来源于stack exchange,提问作者Jon Helt-Hansen
相关产品推荐
相关产品推荐

