find_package原理


Question1 :How find_package() works ?

首先明确一点,cmake本身不提供任何搜索库的便捷方法,所有搜索库并给变量赋值的操作必须由cmake代码完成,比如下面将要提到的FindXXX.cmake和XXXConfig.cmake。只不过,库的作者通常会提供这两个文件,以方便使用者调用。

find_package采用两种模式搜索库:

Module模式:搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件,执行该文件从而找到XXX库。其中,具体查找库并给XXX_INCLUDE_DIRSXXX_LIBRARIES两个变量赋值的操作由FindXXX.cmake模块完成。

Config模式:搜索XXX_DIR指定路径下的XXXConfig.cmake文件,执行该文件从而找到XXX库。其中具体查找库并给XXX_INCLUDE_DIRSXXX_LIBRARIES两个变量赋值的操作由XXXConfig.cmake模块完成。

两种模式看起来似乎差不多,不过cmake默认采取Module模式,如果Module模式未找到库,才会采取Config模式。如果XXX_DIR路径下找不到XXXConfig.cmake文件,则会找/usr/local/lib/cmake/XXX/中的XXXConfig.cmake文件。总之,Config模式是一个备选策略。通常,库安装时会拷贝一份XXXConfig.cmake到系统目录中,因此在没有显式指定搜索路径时也可以顺利找到。

在我遇到的问题中,由于Caffe安装时没有安装到系统目录,因此无法自动找到CaffeConfig.cmake,我在CMakeLists.txt最前面添加了一句话之后就可以了。

set(Caffe_DIR /home/wjg/projects/caffe/build)#添加CaffeConfig.cmake的搜索路径find_package(Caffe REQUIRED)if(NOT Caffe_FOUND)message(FATAL_ERROR"Caffe Not Found!")endif(NOT Caffe_FOUND)include_directories(${Caffe_INCLUDE_DIRS})add_executable(useSSD ssd_detect.cpp)target_link_libraries(useSSD${Caffe_LIBRARIES})

Question 2: How to write "Findxxx.cmake" ?

   We have a lib,which name is "libface_sdk_s.a" in face_sdk/build,and it's header file in include/:

put the file "Findface_sdk.cmake" in cmake/modules/.

root CMakeLists.txt we can add face_sdk information as below:
https://www.ibm.com/developerworks/cn/linux/l-cn-cmake/

www.ibm.com/developerworks/cn/linux/l-cn-cmake/

Question 2: How to write "xxxConfig.cmake" ?

content can be same as Findxxx.cmake

the most different is when we us it in CMakeLists.txt file:

推荐阅读更多精彩内容

  • 首先强烈推荐对CMake不熟的同学先看这本书《Cmake实践》(提取码:qgca)。 CMake说起来是个好东西,...
    金戈大王阅读 46,592评论 5 24
  • 摘要:本系列文章主要讲解caffe的整个使用流程,适合初级入门caffe,通过学习本篇文章,理清项目训练、测试流程...
    踩坑第某人阅读 6,474评论 0 4
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 167,496评论 24 707
  • 小儿真是难养,从八个月开始每月都要生病,也不吃辅食,希望大了就好点吧
    盈语水间阅读 224评论 1 1
  • 好感动,在外公的眼中,可以看到他对我的深深疼爱,真幸福~ 我知道,知道经历了,就是成长,在舅妈家的日子,虽然有...
    Elegant倩阅读 96评论 0 0