回归老本行,写点最近的学习体会。其实这篇总结性质的文是三周前写的。来到RM,来到实验室已经整整四周了,进入11月,会更忙吧。这篇文章大概我也会投CSDN,之前不太搞得懂CSDN的写作模板,现在比较清楚了……
/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/
周末主要鼓捣了一下cmake。
推荐一篇文章:Cmake实践,非常好。
cmake有两种构建方法,分内部和外部,我一开始在网上找到的教程都是外部构建。
具体怎么写Cmakelist如下
MAKE_MINIMUM_REQUIRED(VERSION 3.4.1) //确定cmake最低版本需求 不写的话clion会提醒你加上,再不加终端编译时候也会提醒你,建议顺手加上。
PROJECT(test) //确定工程名 ,指定项目的名称,项目最终编译生成的可执行文件不一定是这个项目名称 必要
MESSAGE(STATUS "Project: SERVER")
MESSAGE(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}") //打印相关消息 不必要,但建议加上。
SET(CMAKE_BUILE_TYPE DEBUG/RELEASE) //确定编译类型debug或release
SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall") //
确定编译器 CMAKE_C_FLAGS_DEBUG ---- C 编译器
CMAKE_CXX_FLAGS_DEBUG ---- C++ 编译器
不必要,建议编译类型为debug,测试小程序两种的编译速度差别不大
FIND_PACKAGE( OpenCV REQUIRED ) // 必要,查找链接库,opencv编译后在系统路径里,比较方便链接,如果是一些没有添加到系统路径的库会比较麻烦,具体以后再讲。
ADD_EXECUTABLE( test test.cpp )//定义了这个工程会生成一个文件名为test的可执行文件,来源自test.cpp工程 必要。
TARGET_LINK_LIBRARIES( test ${OpenCV_LIBS})//将目标文件与库文件进行链接 必要
opencv的库编译后算是系统中的库,所以才用的${OpenCV_LIBS}。
指令是大小写无关的,参数和变量是大小写相关的。推荐全部使用大写指令。看起来舒服。
这样写完后,命令行进入文件夹两个命令
$ cmake .
$ make
这样生产的中间文件,Makefile文件和可运行文件都在一个文件夹里比较乱,外部构建看上去也更像一个工程,所以来试一下外部构建。
/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/
首先写好源码test.cpp,在文件夹里新建build src两个文件夹,build文件夹存放中间文件和最后生成的可执行文件与Makefile,在编译前这个文件夹是空的。src文件夹存放源码。我们要在根目录和src里都写cmakelist文件,但是写的不太一样。
根目录下需要写
CMAKE_MINIMUM_REQUIRED(VERSION 3.4.1)
PROJECT(test)
ADD_SUBDIRECTORY(src bin)
SET(CMAKE_BUILE_TYPE DEBUG)
SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall")
MESSAGE(STATUS "Project: SERVER")
MESSAGE(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")
这是我写的,有删有减,第三行新加的,用于添加外部项目文件夹,最后可执行文件和Makefile就在/src/bin/下第四到七行都不必要。
在src文件夹下,这样写
FIND_PACKAGE( OpenCV REQUIRED )
ADD_EXECUTABLE(test test.cpp)
TARGET_LINK_LIBRARIES( test ${OpenCV_LIBS})
用于链接库和工程的命令都在这里。
之后进入build文件夹
输入这两个命令
$ cmake ..
$ make
经过几天的测试,这样总算是成功了,网上这方面的资料基本没有。
到bin里找到可执行文件,run一下,我写的是一个canny边缘检测,成功了。
要用到其他不和系统链接的库会比较复杂,但大同小异,加几条命令就是了。
最后,cmakelist编写有顺序,不按顺序会报错。
/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/
PS:其实后来网上还是有比较详细的,但是写的是外部库,也很有参考价值吧,地址我就不贴了。
PS:师兄告诉我其实上一届RM的都不这样写工程……现在我也不这样写了。但是他们说的直接根目录写Cmakelist然后在外部直接建立打开的方法,我还是不知道……
这一周写了一个美颜的小程序,作为我们战队公众号的推送。写的很粗糙,下次有机会也贴出来吧。