Cmake makefile CMakeLists.txt都是干什么的?怎么用?

  一直以来在github上找的linux的C代码,我用windows,都要用vs创建个工程给添加进去,会出现两个问题。
  一个问题是包含很多头文件和文件夹的一堆C函数,如何组织起来,include得半天才能搞定,因为在linux中,这些C文件都是通过makefile等我不认识的语法组织起来的,这种情况下虽然能最后改为vs工程,但是耗时很多;另一个问题是linux的C和windows的有些C语法是不同的,有些函数也是不同的,linux写的C中经常有很多函数windows中没有或者反之,这种情况我从来就没改对过一个,每次都是放弃了。
  今天这篇博客是为了解决第一种情况。第二种情况我现在还不知道怎么解决,等请教了大拿再说。

什么是makefile?

  什么是makefile?首先必须明确,只有在linux系统中才用makefile。或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

  因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

  makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

  编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

  总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File。

makefile的用途

  makefile工具被用来自动完成编译工作。包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。

makefile的运行规则

makefile需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。当修改了其中某个源文件时,如果其他源文件依赖该文件,则也要重新编译所有依赖该文件的源文件。这个检查是否更新的过程是makefile文件自动完成的,我们只要负责写好makefile的文件依存关系和编译顺序就可以。
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

如何写makefile?

我参考的博客直接让我看不明白了,后来在b站上看了视频教程,才清楚了。视频链接点这里。这个视频仅适合入门。另一个更完整的视频链接点这里
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

伪目标

常见伪目标 .PHONY
在这里插入图片描述
在这里插入图片描述
用.PHONY的作用是如果当前目录中已经存在target名的文件,用make target名 仍然执行命令。

makefile自动化变量

在这里插入图片描述
makefile使用变量的示例:
在这里插入图片描述

makefile自动推导

在这里插入图片描述
可以省略改成如下:
在这里插入图片描述
可以进一步省略改进成如下:
在这里插入图片描述

makefile中常见函数

在这里插入图片描述

在这里插入图片描述
用函数一劳永逸的方法:
在这里插入图片描述

此后,随意添加.c文件和.h文件,都可以直接运行,不会有错。
也可以用shell命令的方式,修改为如下:
在这里插入图片描述
shell命令的话,就可以使用各种方式了。查找c文件的命令也可以如下:
在这里插入图片描述

c文件存在于多级目录如何适应一劳永逸?

用shell命令中多级查找的方式,如下:
在这里插入图片描述
find -name的查找范围是当前目录及当前目录的所有下级目录,这个需要加上单引号。
修改为如下:
在这里插入图片描述
这样就不报错了。这个模板,换个工程照样能用。
也可以修改为:
**加粗样式**
加上-g就是有调试功能
**加粗样式**

makefile示例文件

**加粗样式**
用在之前也的例子中就是:
在这里插入图片描述
make运行如下:
在这里插入图片描述

Cmake是什么?

  cmake学习参考链接,点击这里。这个链接包含了详细清晰的实例教程。直接看这个链接就可以了。比我这个好,我也是复制粘贴的。
  你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。

  CMake 就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等。

  学习cmake前应该先学习makefile。

  在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

  • 1.编写 CMake 配置文件 CMakeLists.txt 。
  • 2.执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile(ccmake 和 cmake 的区别在于前者提供了一个交互式的界面)。其中, PATH 是 CMakeLists.txt 所在的目录。
  • 3.使用 make 命令进行编译。

  cmake学习参考链接,点击这里。这个链接包含了详细清晰的实例教程。直接看这个链接就可以了。比我这个好,我也是复制粘贴的。对应的代码实例点这里

  经过学习上面链接的教程,体会是:cmake的工作就差不多是windows的vs的项目的配置属性页中可能需要用到的所有信息。

  类似于makefile里的install和test两个伪目标和相应的规则,cmake里也有对应的命令。

CMakeLists.txt 的作用

  如上所述,CMakeLists.txt 就是cmake的配置文件,无它。

参考来源链接

感谢各位原作者的工作,有些不是链接原作者的原创,但是传播知识,让知识的获取更加便捷和浅显易懂,这类工作也非常有意义。
如何用Makefile
B站上比较详细的一个教程
什么是 CMake&CMake 入门实战

Guess you like

Origin blog.csdn.net/u011913417/article/details/118439594