【基础知识】cmake和makefile详解

本文详细介绍了程序的编译和链接过程,重点讲解了makefile和cmake的原理与使用。makefile是管理工程编译规则的工具,而cmake是一个跨平台的自动化构建系统,能够简化工程的构建过程。文章详细阐述了cmake的基本语法、常用指令,包括cmake_minimum_required、project、ADD_SUBDIRECTORY等,并提供了实际的CMakeLists.txt文件示例。此外,还讨论了静态库和动态库的区别以及在编译时的链接问题。
摘要由CSDN通过智能技术生成
  • makefile简介及编写方法详解,参见此博客
  • gcc编译指令详解,参见此博客

一、什么是程序的编译和链接

关于程序编译的一些规范和方法
一般来说,无论是C、C++、还是pas,

  1. 首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)
  2. 然后再把大量的Object File合成执行文件,这个动作叫作链接(link)
  • 编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

  • 链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

总结一下

源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。

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

二、什么是makefile

背景

什么是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成为了一种在工程方面的编译方法。
你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别

这样就带来了一个严峻的问题:

如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile,这将是一件让人抓狂的工作。

  别急,下面即将讲解的cmake就是为了解决这一问题的。

三、cmake介绍及CMakeLists.txt编写规范

首先介绍几个不错的参考博客:

  1. 介绍了 基本的cmake指令------链接1
  2. 介绍了 各种结构代码文件的CMakeLists.txt编写示例------链接2

cmake简介

makefile通常依赖于你当前的编译平台,而且编写makefile的工作量比较大,解决依赖关系时也容易出错。
因此,对于大多数项目,应当考虑使用更自动化一些的 cmake或者autotools来生成makefile,而不是上来就动手编写。

cmake跨平台,并可根据当前平台生成合适的编译配置文件,在 Linux/Unix 平台,生成 makefile,在 苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。

之后只要make一下就可以生成想要的可执行文件或库文件了。

总结一下

  1. 根据cmake的语法规则 编写好配置文件 CMakeLists.txt。
  2. 执行命令 cmake PATH 或者 ccmake PATH 自动生成适合当前平台的 Makefile(ccmake 和 cmake 的区别在于前者提供了一个交互式的界面)。其中, PATH 是 CMakeLists.txt 所在的目录。
  3. 使用 make 命令进行编译。

基本语法

CMake要求要求工程主目录和所有存放源代码子目录下都要编写CMakeLists.txt文件,注意大小写(CM 大写,Lists中L要大写且不要落下s)。
在这里插入图片描述

指令(参数1 参数2…)
参数使用括弧括起,参数之间使用空格或分号分开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值