已有lib.a文件,如何在C++/ROS(CMake)项目中添加该静态库
C++/ROS项目引入预编译静态库操作指南
相关CMake指令差异说明
add_library():用于向当前工程添加库目标,支持添加当前工程源码编译的库,也支持导入外部预编译好的库,是你当前场景的核心使用指令。find_library():用于在指定搜索路径下查找预编译库文件的完整路径,避免硬编码库文件路径,属于可选辅助指令。ExternalProject_Add():用于在CMake构建阶段自动完成外部依赖的下载、编译、安装流程,你已经手动完成了库的编译,该指令无需使用。
实操配置步骤
你需要提前确认两个必要资源的路径:
- CSF库的头文件目录(通常命名为
include,内含所有调用库需要引入的.h/.hpp文件) - 编译完成的静态库文件(即你拿到的
libCSF.a文件)
步骤1:导入外部静态库目标
在你工程的CMakeLists.txt中添加如下内容,路径替换为你自己的实际路径:
# 声明导入外部静态库,别名为CSF add_library(CSF STATIC IMPORTED) # 配置CSF库的头文件路径和库文件路径 set_target_properties(CSF PROPERTIES # 头文件目录,CMAKE_CURRENT_SOURCE_DIR为当前CMakeLists.txt所在目录,推荐用相对路径方便协作 INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/CSF/include" # 静态库文件路径,替换为你的libCSF.a实际存放路径 IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/CSF/lib/libCSF.a" )
如果需要避免硬编码路径,可以先用find_library查找库路径:
# 查找libCSF.a,PATHS后替换为库存放的目录 find_library(CSF_LIB NAMES CSF libCSF.a PATHS "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/CSF/lib" NO_DEFAULT_PATH) # 后续配置IMPORTED_LOCATION时直接用变量即可 set_target_properties(CSF PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/CSF/include" IMPORTED_LOCATION ${CSF_LIB} )
步骤2:将库链接到你的工程目标
纯C++项目场景
将CSF库链接到你的可执行目标,your_executable替换为你的实际目标名:
target_link_libraries(your_executable PRIVATE # 如果你工程的公开头文件引用了CSF的头文件,改为PUBLIC CSF # 其他你已有的依赖库 )
ROS(Catkin构建)项目场景
直接修改工程原有的target_link_libraries配置,添加CSF即可:
target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES} # 其他你已有的依赖库 CSF )
配置验证
如果编译时报头文件找不到错误,检查INTERFACE_INCLUDE_DIRECTORIES配置的路径是否正确;如果编译时报「未定义的引用」类错误,检查IMPORTED_LOCATION的库路径是否正确、库的编译架构和你当前工程的编译架构是否匹配。
内容的提问来源于stack exchange,提问作者TheAddie
相关产品推荐
相关产品推荐

