CMake如何正确链接项目目录外部本地构建的静态库
问题根因
静态库的链接配置仅负责传递二进制链接依赖,不会自动将库的头文件搜索路径同步给依赖方。当前LibA的CMake配置没有声明对外暴露的头文件目录,因此编译AppA时编译器无法定位Animal.h等头文件,和静态链接规则本身无关。
修复方案
1. 为LibA配置公开头文件搜索路径
修改common/LibA/src/CMakeLists.txt,添加target_include_directories配置,将存放LibA头文件的源码目录设为PUBLIC属性,所有链接LibA的目标会自动继承该路径,无需重复配置:
cmake_minimum_required (VERSION 3.8) add_library( LibA STATIC "Animal.cpp" "Animal.h" "Dog.h" "Dog.cpp" ) # 声明头文件目录,PUBLIC属性表示该目录对LibA自身和所有依赖LibA的目标生效 target_include_directories(LibA PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_property(TARGET LibA PROPERTY CXX_STANDARD 11)
2. 修正外部子项目的二进制输出路径
当前AppA/CMakeLists.txt中add_subdirectory的第二个参数(外部子项目的二进制输出目录)写为"build",会导致LibA的编译产物输出到AppA/build/build层级,和预期目录结构不符,修改为明确的二进制目录即可:
cmake_minimum_required (VERSION 3.8) project ("AppA") # 引入外部LibA项目,第二个参数指定LibA的编译产物输出路径 add_subdirectory("../common/LibA" "${CMAKE_BINARY_DIR}/LibA") add_subdirectory ("src")
3. AppA侧无需额外修改
AppA/src/CMakeLists.txt中已有的target_link_libraries(AppA LibA)配置已经满足静态链接要求,LibA的头文件路径会通过PUBLIC属性自动传递给AppA的编译目标,不需要额外添加include配置。
修改完成后清空原有build目录重新执行CMake配置、编译,即可正常找到头文件完成构建,最终生成的AppA.exe会静态整合LibA的全部代码,无额外运行时依赖。
内容的提问来源于stack exchange,提问作者ithari42
相关产品推荐
相关产品推荐

