学习camke就是,跟着教程写觉得,恩,没毛病,代码简单,思路清晰,总共就那么几个命令,so easy!然而!一到自己来写就是,哪哪都是毛病!大小写都能纠结个把小时!面对那些头文件,就是一种我找得到你,却调不到你呢无奈…重点是,编译时报的错,我是看不懂的…百度也很难百度到同样的错…谨以此篇博客,献给被cmake折磨一下午的我。重点是一下午过去,中饭都没吃的我,依旧没把它搞懂…[哭]
1.find_package
find_package,顾名思义,是用来找包的,但是并不是哪的包都能找
模块模式:
搜索CMAKE_MODULE_PATH指定路径下的FindXXX.cmake文件,执行该文件从而找到XXX库。其中,具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由FindXXX.cmake模块完成。
LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
//把 ${PROJECT_SOURCE_DIR}/cmake_modules添加到CMAKE_MODULE_PATH
//不要问我CMAKE_MODULE_PATH的默认路径是啥 我也不知道
如果在上面的路径中没有找到FindXXX.cmake文件,它会在这个路径下 <CMAKE_ROOT>/share/cmake-x.y/Modules/(对于我的,路径就是/usr/share/cmake-3.5/Modules)搜索FindXXX.cmake,可以通过命令 cmake --help-module-list 得到你的CMake支持的模块的列表。
重点:如果使用LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)命令,一定记得把findXXX.cmake文件拷贝到当前的cmake_modules文件夹下,一般库的findXXX.cmake文件就在它的源码里,例如g2
o的文件路径为:g2o/cmake_modules文件夹下。
配置模式:
如果没找到这样的文件,find_package()会在~/.cmake/packages/或/usr/local/share/中的各个包目录中查找,寻找<库名字的大写>Config.cmake 或者 <库名字的小写>-config.cmake (比如库Opencv,它会查找/usr/local/share/OpenCV中的OpenCVConfig.cmake或opencv-config.cmake),但是用这种方法根本找不到ceres的findCeres.camke文件,玄学…