【知识图谱】理解cmake

一个好的代码需要跨平台,跨操作系统,日常编程,IDE都帮忙做,一条龙服务,集成编译,代码需要编译才能运行,但是比如想与别人分享代码,工程项目无所谓,打包发布给人家就行了,也不用给人家源码,实在需要源码就去一步步教人家怎么搭建开发环境,但是如果要分享实验代码,不知道对方是什么开发平台,又想让尽可能多的人能看到和跑起来代码,就要学习自己编译源代码而不是IDE,其实想想matlab还是挺好的,编译器大多就用那么一个,.m文件即开即用,但是比如c++语言,不同的平台差异巨大,同样用qt,ubuntu项目移植到windos得搞半天还不一定搞定,那还怎么和别人分享代码,这就需要有编译代码的工具,到哪只需要编译最后的结果就可了,因此就需要学习一下make,特此记录一下。

cmake

  • 首先cmake的概念
  • cmake 工作过程
  • cmake 语法
    简单来说cmake 就是根据CmakeLists.txt生成一个编译规则,ubuntu下生成makefile文件,同编译器生成的工程文件一样,决定着中间件编译的规则。ubuntu下简单的cmake命令,windos下可以利用cmake软件,cmake软件将cmake过程分为两步,configure与generate,分别生成对应文件夹与生成编译规则。
    这里写图片描述

make

  • makefile理解
    简单来说编译器只能逐个文件编译,生成中间件,而makefile就是将这些中间件统一编译的规则。
  • .o文件(中间件)
  • make的执行过程如下:
    • 依次读取变量“MAKEFILES”定义的makefile文件列表
    • 读取工作目录下的makefile文件(根据命名的查找顺序“GNUmakefile”,“makefile”,“Makefile”,首先找到那个就读取那个)
    • 依次读取工作目录makefile文件中使用指示符“include”包含的文件
    • 查找重建所有已读取的makefile文件的规则(如果存在一个目标是当前读取的某一个makefile文件,则执行此规则重建此makefile文件,完成以后从第一步开始重新执行)
    • 初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
    • 根据“终极目标”以及其他目标的依赖关系建立依赖关系链表
    • 执行除“终极目标”以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件)
    • 执行“终极目标”所在的规则

make 与 make install

简单的说,make的过程是把各种语言写的源码文件,变成可执行文件和各种库文件。make install是把这些编译出来的可执行文件和库文件复制到合适的地方。
make install (对 make 命令来说)字面意思就是达成 install 这个目标。这个目标既然叫 install,当然是执行软件的安装了。
* 动态链接库与静态链接库的区别与联系
类 UNIX 系统的软件,有些不需要安装,执行可执行文件就可以直接用了。有些则不是这样,比如软件需要的配置文件、资源文件没有复制到相应的位置,包括动态链接库的软件需要更新动态链接库缓存否则会因为找不到刚刚编译出来的动态链接库而出错,等等。
* make
make后可执行的文件已经生成,在编译的目录下找到生成的可执行文件,运行./filename 就可以运行(如果有库文件生成,有可能因找不到库文件无法而运行),但要在其它地方运行就要把这个路径加进去,例如你的文件在/home/user/test目录下,在其它目录运行就要运行/home/user/test/filename,主要是因为test目录不在系统的环境变量中,可以通过添加系统环境变量然后在任意目录下运行filename来执行程序。
* make install
make install是根据编译配置将编译生成的可执行文件拷贝到/usr/bin或/usr/local/bin,编译生成的库文件拷贝到/usr/lib或/usr/local/lib,头文件在/usr/include和/usr/local/include,帮助文件在/usr/share 或/usr/local/share。执行make install后可以在任意位置通过命令:filename 来运行程序,如果是窗口程序的话,大多可以在启动菜单种找到。

opencv为例

  • 首先进行configure 进行配置,生成需要的文件夹及准备文件
    这里写图片描述
    这里写图片描述
  • 再generate生成工程文件,如果编译器选择vs,则生成vs工程文件,如果是ubuntu,则生成makefile
    这里写图片描述
    这里写图片描述
  • 最后就是执行生成的工程文件,vs就是执行工程,对应着ubuntu里的make命令。

猜你喜欢

转载自blog.csdn.net/weixin_42641395/article/details/82430459