今天要尝试编译一下opencv,发现并不是用我熟悉的makefile来编译的,网上查阅了一下资料发现原来需要用到cmake这款工具,貌似和make只差一个字母的东东为什么opencv要用呢,这让我十分好奇,经过了查询,发现还是二者有一定的区别的。
Make(或者说一个Makefile)是构建系统 - 它驱动编译器和其它构建工具来构建你的代码。
“Make”是一个工具,它控制可执行文件和程序的源文件以及程序的其他非源文件的生成。
经过初步尝试之后,我发现cmake相当与make的上一步的加工,cmake加工好的东西其中之一就是makefile,然后再经过make的加工我们可爱的文件就变成了可执行得程序。
这就好比我们在收小麦,以前我们只能自己拿锄头收割小麦,然后把小麦的皮弄下来,之后给工厂加工处理成为面粉,但是我们现在有了收割机,大幅度的增加了我们的收割效率。而这就好比cmake给我们带来的便捷:以前我们都是去手写一个makefile文件,但是有了cmake,我们就可以略去些makefile文件,只需要写一些文件之间的关系。只把"小麦种进去,然后就可以开着现代化设备收割了"。
口说无凭,来一段代码尝试一下
目录结构:
| - include --- a.h
test_cmake - | - src --- a.c / main.c
| - CmakeLists.txt
// test_cmake/include/a.h
#ifndef A_H
#define A_H
#include <math.h>
double get_sqrt(double val);
#endif
// test_cmake/src/a.c
#include "../include/a.h"
double get_sqrt(double val)
{
return sqrt(val);
}
// test_cmake/src/main.c
#include <stdio.h>
#include "../include/a.h"
int main()
{
double b = 25.0;
double a = 0.0;
a = get_sqrt(b);
printf("a is %lf, b is %lf\n", a, b);
return 0;
}
这个代码实现的东西很简单,就是一个求根。
下面我们就需要写一下文件的依赖关系了
# test_cmake/CMakeLists.txt
#头文件所在的目录
INCLUDE_DIRECTORIES(include)
#源文件所在的目录,并且把src这个值赋给DIR_SRCS
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
#赋值
SET(LIBRARIES
libm.so
)
#得到可执行文件bin
ADD_EXECUTABLE(./bin ${DIR_SRCS})
#需要的库
TARGET_LINK_LIBRARIES(./bin ${LIBRARIES})
1.声明一下头文件的目录
2.声明源文件的目录
3.把需要的库的名字赋值给一个变量
4.可执行文件的名字和需要的源文件
5.需要的链接库
这样就可以了,:wq保存退出之后直接在命令行输入cmake.就可以创建出makefile文件和一些其他的文件了
之后在make就可以创建出可执行文件了
这是目前我所了解到的一些很基础的关于cmake用法,希望以后可以了解更多