CMake初级简明教程( 二 )


find_package(OpenCV REQUIRED)
set(PCL_DIR"D:/program-tools/PCL/PCL 1.12.1/cmake")find_package(PCL REQUIRED)
这样就不会再报错了 。
再比如,我要引入,怎么办:
set(OpenCV_DIRD:/opencv/opencv3.4.6/opencv/build/x64/vc15/lib/)find_package(OpenCV REQUIRED)
你可能注意到,这两个DIR一个是字符串,一个不是,这个不重要,两个写法都是可以的 。
set(ABC_DIR "your path")find_package(ABC REQUIRED)
模式:搜索指定路径下的.cmake文件,执行该文件从而找到XXX库 。其中,具体查找库并给和两个变量赋值的操作由.cmake模块完成(先搜索当前项目里面的文件夹里面提供的.cmake,然后再搜索系统路径/usr/local/share/cmake-x.y//.cmake)模式:搜索指定路径下的.cmake文件,执行该文件从而找到XXX库 。其中具体查找库并给和两个变量赋值的操作由.cmake模块完成 。5.
include_directories(${OpenCV_INCLUDE_DIRS})include_directories("D:/program-tools/PCL/PCL 1.12.1/include/pcl-1.12/")include_directories("D:/program-tools/PCL/PCL 1.12.1/3rdParty/FLANN/include/")
示例讲解:
第一行:${}是一个变量,里面的值显而易见是个路径 。通过引入搜索路径 。
第二、三行:引入指定头文件搜索路径 。
个人讲解:
关于${}这类函数怎么来,一般是.cmake这种自带的引导文件自带的,你自己读就可以看到,一般都在注释里面注明了 。
这种库提供的变量,其实一般已经被库自带的引导文件自动包含了,但是为了vs code的自动补全,你不妨再手动添加一下,反正也没什么坏处 。
6.
含义:添加可执行文件
示例:
add_executable(main ${PROJECT_SOURCE_DIR}/DNN/dnn.cpp${PROJECT_SOURCE_DIR}/main.cpp)
关于什么是${},自己去查,到这都四千字了懒得写了 。

CMake初级简明教程

文章插图
个人讲解:
第一个参数就是可执行文件的名字,下面就是main.exe,后面若干个参数都是说明了,这个可执行文件是由哪几个源代码编译过来的 。当你的工程很简单的时候,可能一个cpp就可以编译出来一个exe可执行文件,但是一些稍微复杂一点的就不是这样的了 。
需要注意的是,这个函数其实老版cmake是不支持一下添加好几个源文件的,因为其实源文件里面也有依赖关系,例如你在A.cpp里面定义了类A,在main.cpp里面使用了类A,那么如果你先编译main.cpp就会报错 。但是我看现在的cmake好像都支持自动排序编译,很实用 。不过仍然建议,按照你源文件的依赖顺序去写,对你自己也不无好处 。
一个项目可以不止生成一个目标文件 。
7.s
含义:对该目标链接库
示例:
target_link_libraries(main${OpenCV_LIBS})target_link_libraries(test ${Boost_LIBRARIES} ${Qhull_LIBRARIES} ${PCL_LIBRARIES} ${PTHREAD_LIB})
个人理解:
需要注意的是,先生成目标再链接库 。链接库是在编译成可执行文件后面的,不要把顺序搞反了 。后面的其实是库的列表,这个${}大家有兴趣可以打印出来看看是什么 。8.
含义:输出,打印
示例:
message(root: "111 ${PCL_ROOT} 1111")
效果:
可以看到,${}括起来的自动替换为变量的值,而root:即使没有被套在双引号内,仍然是作为字符打印的 。这个常用做调试,查看变量的值 。这个是终端,没有颜色 。如果是的,通过改变参数,可以输出红色、黄色等颜色的错误、警告 。