一点一滴成长

导航

Make和CMake

1、gcc

  gcc main.c是生成可执行文件(包括编译和链接),可执行文件名默认为a.out,可以加上-o指定生成的可执行文件名:gcc main.c -o ma。

  gcc main.c实际上相当于两条语句:gcc -c main.c(生成目标文件main.o) + gcc main.o(链接生成可执行文件a.out,指定生成的可执行文件名的话为gcc main.o -o name)。

  gcc编译两个文件:gcc func1.c func2.c -o fun。

  .a是linux中的静态库文件,也被称为归档文件,它是一组目标文件(.o文件)的集合,可能包含多个不同的目标文件,还包含用于描述和管理这些目标文件的信息(函数、变量的符号表,目标文件之间的依赖关系等)。

  .so是linux中的动态库文件,也被称为共享库文件。

2、Make

  使用gcc编译多个文件或者一个庞大项目的话使用gcc就很麻烦,这时候可以用make命令工具,使用make需要先生成一个makefile文件,在这个文件中包含要创建的目标文件或可执行文件、创建目标文件所依赖的文件和需要运行的命令、编译顺序等信息,make通过读入和解释Makefile中内容来执行gcc/g++编译工作。使用make的另一个优点就是如果有一个文件修改了,那么它能使该文件和所有受影响的文件进行重新编译,而不受影响的文件就不必重新编译,这样就节省了编译时间。

  make对Windows系统不太友好,不支持跨平台,Windows下的话可以使用Visual C++的nmake,VS命令行工具中可以直接使用nmake这个命令。

3、CMake

  因为make只适合GUN liunx下使用,编写的makefile适合GCC而不适合MSVC,所以CMake就应运而生。CMake支持跨平台, 它可以根据不同平台、不同的编译器,生成相应的Makefile(在Windows下即为vcproj项目文件)。CMake是写一份独立的CMakeList.txt文件,然后该文件会根据当前系统环境选择适合的构建生成器(如VS或者make),然后将CmakeList.txt翻译为适合的文件,再进一步调用系统编译器进行项目构建。

  qmake是Qt的项目管理工具,对应的工程文件是*.pro,在Linux下面它也会生成Makefile。

  CMake的使用:比如对于CEF浏览器项目,我们先到 https://cef-builds.spotifycdn.com/index.html#windows32:79 下载包,然后就可以打开CMake软件,如下所示,在source code输入栏选择cef解压后的目录,build目录输入栏选择项目生成所在的目录,点击configure来设置生成项目的类型以及平台,这里我们选择VS 15 (2017),32位,然后点击generate来生成项目,生成完成后,点击Open Project,就打开生成的cef项目。

  

4、GCC-> Make -> CMake

  写程序大体步骤为:

  ①、用编辑器编写源代码,如.c文件。

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

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

  但如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译。但是你需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的技能。

  编写makefile实在是件复杂的事,于是人们又想,为什么不设计一个工具,读入所有源文件之后,自动生成makefile呢,于是就出现了cmake工具,它能够输出各平台对应的makefile或者project文件, 从而帮助程序员减轻负担。虽然不用编写makefile了,但是随之而来也就是编写cmakelist文件,它是cmake所依据的规则。

  流程图:

  

  抽象层次图:

   

5、MinGW、MSVC、Clang

  MinGW是Windows下GCC/G++移植版,MinGW 能够编译不包含 MFC 的、以 WinSDK 为主的 Windows 应用,因此,MinGW 被许多 Linux 上发展起来的开发工具选择为 Windows 版本的默认编译器。

  MSVC则是Visual Studio IDE中的C/C++编译器。

  Clang是LLVM的编译器前端(词法分析、语法分析等),它与LLVM的后端(代码生成和优化)紧密结合,形成了一个完整的编译器工具链。LLVM是一个开源编译器项目,提供通用的编译器技术和工具,支持多种编程语言,如C/C++、Objective-C,Rust、Swift等。许多IDE和开发工具,如Xcode和Visual Studio Code,使用Clang作为其内置的编译器前端,提供代码编辑、自动完成、静态分析等功能。

6、Cygwin、WSL

  Cygwin提供运行于 Windows 平台的类 Unix 环境(以 GNU 工具为代表),为了达到这个目的,Cygwin 提供了一套抽象层 dll,用于将部分 Posix 调用转换成 Windows 的 API 调用,实现相关功能。Cygwin相当于是运行于Windows平台的POSIX“子系统”,提供Windows下的类Unix环境,并提供将部分Linux 应用“移植”到Windows平台的开发环境的一套软件。目前很多人把将Linux应用移植到Windows平台的任务都交给了Cygwin,Cygwin不是让linux程序直接在windows上运行,想要让linux程序在windows运行的话,需要通过Cygwin重新编译一下源文件。在Cygwin做的东西(不用win32的)可以无缝的用在linux下,所以在windows下开发linux程序的话Cygwin是一个很好的选择。

  WSL 全称为 Windows Subsystem for Linux,是一个为在 Windows 10 上能够原生运行 Linux 二进制可执行文件(ELF格式)的兼容层,相对于虚拟机,其性能更好。

 

posted on 2020-09-03 17:38  整鬼专家  阅读(1542)  评论(0)    收藏  举报