make CMake 前因后果

理论上说,任意一个C++程序均可以用g++来编译。linux

你们都知道,写程序大致步骤以下:c++

一、用编辑器编写源代码,如.c文件。程序员

二、用编译器编译代码生成目标文件,如.o。编程

三、用连接器链接目标代码生成可执行文件,如.exe。编辑器

makefile函数

但若是源文件太多,一个一个编译时就会特别麻烦,因而人们想到,为何不设计一种相似批处理的程序,来批处理编译源文件呢?工具

因而就有了make工具,它是一个自动化编译工具,你可使用一条命令实现彻底编译。post

可是你须要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,因此编写makefile文件也是一个程序员所必备的技能。ui

 

Unix中Make三连spa

Unix 开发过程当中,常常性的操做是从源码编译安装相应库文件,因此下面三个命令即是屡见不鲜,俗称三连:

./configure

make

make install

下面来看看这三步分别作了什么。

configure

执行 ./configure 文件通常是进行正式编译前的一些环境准备,准备编译须要的依赖项等。好比检测当前的系统平台,检测须要的编译器是否存在如何调用,配置和生成相应编译所需文件。

make

前期准备工做完成无误后,就可能调用 make 来执行编译了。实际执行的是 Makefile 文件中定义的任务来从源码进行项目的编译。

一般状况下下载下来的 tar 包中可能没有包含正式的 Makefile 文件,而是另外形式呈现的临时文件,好比 Makefile.in,Makefile.am,Makefile.MSVC 等,而后在执行 ./configure 的时候根据相应环境来生成最终须要的 Makefile 文件。

make install

项目编译正常后,会生成相应的产出,可执行文件,so 或 o 文件或 DLL 动态连接文件等。最后一步就是将生成的文件复制到相应的系统目录,这个过程即是安装。

好比将可执行文件复制到系统 PATH 能取到的地方,帮助文档复制到 MANPATH,其余文件复制到对应目录下。

 

CMakelists.txt

对于一个大工程,编写makefile实在是件复杂的事,因而人们又想,为何不设计一个工具,读入全部源文件以后,自动生成makefile呢?

因而就出现了cmake工具,它可以输出各类各样的makefile或者project文件,从而帮助程序员减轻负担。

可是随之而来也就是编写cmakelist文件,它是cmake所依据的规则。因此在编程的世界里没有捷径可走,仍是要脚踏实地的。

 CMakeLists.txt基本结构 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
#声明要求的cmake最低版本 cmake_minimun_required(VERSION 2.8) #声明一个cmake工程,工程名为post_fusion project(post_fusion) # 添加c++ 11标准支持 set( CMAKE_CXX_FLAGS "-std=c++11" ) 若是程序中使用了C++11标准,则须要设置告诉编译器,没有能够不用写。 #设置编译器编译模式: set( CMAKE_BUILD_TYPE "Debug" ) 对于编译用的Debug模式和调试用的Release模式,在Debug模式中,程序运行较慢,当能够在IDE中进行断点调试,而Release模式则速度较快,但没有调试信息。不设置默认是Debug模式。 # 添加引用的第三方头文件,例如添加Eigen头文件 include_directories( "/usr/include/eigen3" ) #编译生成库文件 add_library(irfusion comfunc.c post_sins_gnss.cpp) #这条命令告诉cmake,咱们想把这些源文件编译成一个叫做“irfusion”的库。在linux中,库文件分为静态库和动态库两种,静态库以.a做为后缀名,共享库以.so结尾。 #全部库都是一些函数打包后的集合,差异在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间。若是想生成共享库而不是静态库,只须要使用如下语句便可 add_library(irfusion_shared SHARED  comfunc.c post_sins_gnss.cpp)此时获得的文件就是irfusion_shared.so了。 #而后,在CMakeList.txt中添加一个可执行程序的生成命令,连接到刚才使用的库上: add_executable(irfusion main.cpp) target_link_libraries(irfusion irfusion_shared)
相关文章
相关标签/搜索