Question1 :How find_package() works ?
首先明確一點(diǎn)剿干,cmake本身不提供任何搜索庫的便捷方法铛楣,所有搜索庫并給變量賦值的操作必須由cmake代碼完成却盘,比如下面將要提到的FindXXX.cmake和XXXConfig.cmake栅干。只不過,庫的作者通常會提供這兩個文件甲脏,以方便使用者調(diào)用。
find_package采用兩種模式搜索庫:
Module模式:搜索CMAKE_MODULE_PATH指定路徑下的FindXXX.cmake文件妹笆,執(zhí)行該文件從而找到XXX庫块请。其中,具體查找?guī)觳⒔oXXX_INCLUDE_DIRS和XXX_LIBRARIES兩個變量賦值的操作由FindXXX.cmake模塊完成拳缠。
Config模式:搜索XXX_DIR指定路徑下的XXXConfig.cmake文件墩新,執(zhí)行該文件從而找到XXX庫。其中具體查找?guī)觳⒔oXXX_INCLUDE_DIRS和XXX_LIBRARIES兩個變量賦值的操作由XXXConfig.cmake模塊完成窟坐。
兩種模式看起來似乎差不多海渊,不過cmake默認(rèn)采取Module模式绵疲,如果Module模式未找到庫,才會采取Config模式臣疑。如果XXX_DIR路徑下找不到XXXConfig.cmake文件盔憨,則會找/usr/local/lib/cmake/XXX/中的XXXConfig.cmake文件⊙渡颍總之郁岩,Config模式是一個備選策略。通常缺狠,庫安裝時會拷貝一份XXXConfig.cmake到系統(tǒng)目錄中问慎,因此在沒有顯式指定搜索路徑時也可以順利找到。
在我遇到的問題中儒老,由于Caffe安裝時沒有安裝到系統(tǒng)目錄蝴乔,因此無法自動找到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/.
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: