find_package 总结

本文详细解释了CMake中find_package函数的工作原理,包括Module模式和Config模式的查找过程,以及findadd.cmake的demo示例,展示了如何在CMakeLists.txt中正确使用find_package以找到并设置库的头文件和库文件路径。

本文参考:“轻松搞定CMake”系列之find_package用法详解

原理

find_package 即在指定目录CMAKE_MODULE_PATHCMAKE_PREFIX_PATH查找对应的cmake文件。

find 模式

  • Module模式(默认):查询Findxxx.cmake配置文件, 在CMAKE_MODULE_PATH 目录
  • Config模式:查询xxxConfig.cmake or <lower-case-package-name>-config.cmake配置文件,在xxx_DIRCMAKE_PREFIX_PATH目录

如果Module模式失败则自动转入Config模式。如果Config失败,则find_package 失败。

Config模式路径查找顺序

  1. 名为<PackageName>_DIR的CMake变量或环境变量路径(默认为空)
  2. 名为CMAKE_PREFIX_PATHCMAKE_FRAMEWORK_PATHCMAKE_APPBUNDLE_PATH的CMake变量或环境变量路径
  3. PATH环境变量路径

findxxx.cmake配置文件大众规则(规则、变量自定义)

xxx_FOUND:BOOL 类型,如果成功则为true
xxx_INCLUDES: 模块的头文件位置
xxx_LIBRARIES:库文件位置

demo展示(add)

findadd.cmake or addConfig.cmake

message("Find add:"  $ENV{path})
message("PROJECT_SOURCE_DIR:"${PROJECT_SOURCE_DIR})
#find headers
find_path(add_INCLUDES
        NAMES add.h 
        PATHS ${PROJECT_SOURCE_DIR}/add ${PROJECT_SOURCE_DIR}/add1)

#find lib
find_library(add_LIBRARIES 
            NAMES add.lib
            PATHS ${PROJECT_SOURCE_DIR}/add/lib ${PROJECT_SOURCE_DIR}/add1/lib)


message("add_INCLUDES="${add_INCLUDES})
message("add_LIBRARIES="${add_LIBRARIES})

if(add_LIBRARIES AND add_LIBRARIES)
    set(add_FOUND TRUE)
endif()


message("add_FOUND:"${add_FOUND})

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(mylib)


#module 模式
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/)

#config模式
set(add_DIR ${PROJECT_SOURCE_DIR}/cmake/)
message("CMAKE_MODULE_PATH=" ${CMAKE_MODULE_PATH})
find_package(add)

if(add_FOUND)
message("add package find")
else(add_FOUND)
message("add package not find")
endif(add_FOUND)

结果展示

在这里插入图片描述

总结:查找并引入库

#指定库的安装目录
list(APPEND CMAKE_PREFIX_PATH "d://123//xhttp")
#查找XHTTP
find_package(XHTTP REQUIRED)
message("XHTTP_FOUND=${XHTTP_FOUND}")

#如果查找库成功,则查找对应的头文件所在位置
if(XHTTP_FOUND)
   target_link_libraries(hello XHttp::XHTTP)
   #find header path
   find_path(XHTTP_INCLUDES NAMES "xhttpapi.h")
   message("XHTTP_INCLUDES=${XHTTP_INCLUDES}")
   #引入头文件
   include_directories(${XHTTP_INCLUDES})
endif(XHTTP_FOUND)
if(BUILD_WITH_OPENMP) find_package(OpenMP) if(NOT OpenMP_FOUND) message(FATAL_ERROR "\n\n OpenMP is missing!\n\n") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -fopenmp") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") endif() endif() if(SET_USER_BREAK_AT_STARTUP) message("GOT FLAG IN CmakeLists.txt") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DBPDEBUG") endif() find_package(ament_cmake REQUIRED) find_package(builtin_interfaces REQUIRED) find_package(cv_bridge REQUIRED) find_package(image_transport REQUIRED) find_package(rclcpp REQUIRED) find_package(rclcpp_action REQUIRED) find_package(rclcpp_components REQUIRED) find_package(realsense2_camera_msgs REQUIRED) find_package(std_srvs REQUIRED) find_package(std_msgs REQUIRED) find_package(sensor_msgs REQUIRED) find_package(nav_msgs REQUIRED) find_package(tf2_ros REQUIRED) find_package(tf2 REQUIRED) find_package(diagnostic_updater REQUIRED) find_package(OpenCV REQUIRED COMPONENTS core) find_package(realsense2 2.56.5-0~realsense.17053) if (BUILD_ACCELERATE_GPU_WITH_GLSL) find_package(realsense2-gl 2.56.5-0~realsense.17053) endif() if(NOT realsense2_FOUND) message(FATAL_ERROR "\n\n Intel RealSense SDK 2.0 is missing, please install it from https://github.com/IntelRealSense/librealsense/releases\n\n") endif() #set(CMAKE_NO_SYSTEM_FROM_IMPORTED true) include_directories(include) include_directories(${OpenCV_INCLUDE_DIRS}) # add OpenCV includes to the included dirs set(node_plugins "")
最新发布
11-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值