之前编程都是用IDE,虽然之前也有用过sublime,但是主要是写网页,也有写过c++, 用过MinGW,但是当时糊里糊涂,也不知道这个MinGW到底是什么,就只知道他是一个编译器。前一阵子在ubuntu上写代码开始使用atom写c++,半粘贴半瞎猜,也算写了一个cmakelist.txt,然后用cmake运行,还顺便学着写了一点shell脚本给一匹图片命名。今天需要用到windowns下的一个库,兴致勃勃在win下也装了atom,并安装了gcc的编译运行插件。
然后,编译运行gcc乱码,hello world都运行不出来,查了一会,突然反应过来,我电脑里好像还没有gcc编译器。然后就去官网试图安装gcc,后来才发现好像我应该装的是MinGW。
好了,问题来了
gcc是什么呢?
MinGW又是什么呢?
他们之间有什么关系呢?
gcc是什么?
GCC是GCC 是一个原本用于 Unix-like 系统下编程的编译器, 是GNU公社的一个项目。是一个用于编程开发的自由编译器。最初,GCC只是一个C语言编译器,他是GNU C Compiler 的英文缩写。随着众多自由开发者的加入和GCC自身的发展,如今的GCC以经是一个包含众多语言的编译器了。其中包括 C,C++,Ada,Object C和Java等。所以,GCC也由原来的GNU C Compiler变为GNU Compiler Collection。也就是 GNU编译器家族 的意思。当然,如今的GCC借助于他的特性,具有了交叉编译器的功能,即在一个平台下编译另一个平台的代码。
MinGW又是什么呢?
GCC是GCC 是一个原本用于 Unix-like 系统下编程的编译器, 而MinGW是gcc在windows下的移植版本。gcc在windows下的移植版本除了MinGW还有Cygwin 和 Djgpp。
引自这里:Windows下如何安装GCC
参见这里
第三个问题答案见第二个问题。
知道了gcc和MinGW是什么之后,我需要运行的库需要openGL环境,需要链接lib库,可能也需要使用make来编译。
那么我头上又长了问号
什么是lib库?怎么链接lib库?作为一个程序员,我对链接竟然还是感觉陌生。
make用makefile?CMake用cmakelist.txt?
make是什么,CMake又是什么?他们俩又有什么关系??
- 什么是lib库?
要想知道lib库,还是要先知道c++程序从源码是如何变成可执行文件的。这个我大一就学了,但是这个还没有深深刻在脑子里。
c++从源码到可执行文件经历了以下过程:
源代码就是人写的代码,也是给人看的任何文本编辑器都能写。
目标文件也叫目标码,是给机器看的,是机器语言,也就是01串,目标文件也叫机器语言文件。
编译后得到的机器语言程序还需要跟其他支撑库代码,主要是跟全局变量和函数链接到一起,这样才能形成可执行文件。
言归正传,什么是库文件?
编译的时候,一般来说,每一个源文件(一对.h以及.cpp)都对应一个中间目标文件。但是当工程较大,源文件太多的时候,编译生成的目标文件过多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,这个打包后得到的目标文件就是所谓的库文件。
至于怎么链接库文件,那是gcc命令的事,或者说是makefile的事。
目标文件 ,库文件,可执行文件在windows以及linux下的扩展名如下:
平台 | 目标文件 | 库文件(静态/动态) | 可执行文件 |
---|---|---|---|
windows | .obj | .lib/.dll | .exe |
linux | .o | .a/.so | 无,见备注 |
备注:linux中,可执行是一种权限,跟可读可写一样,判断一个文件是不是可执行并不是根据扩展名,而是根据该文件有没有可执行权限,linux下文件的可执行权限通过chmod命令赋予。
参考这里
.
.
2. make vs CMake
这里先分别把他们官网各自的描述贴出来。
make官网
GNU Make is a tool which controls the generation of executables and other non-source files of a program from the program’s source files.
Make gets its knowledge of how to build your program from a file called the makefile, which lists each of the non-source files and how to compute it from other files. When you write a program, you should write a makefile for it, so that it is possible to use Make to build and install the program.
CMake is an open-source, cross-platform family of tools designed to build, test and package software.CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefiles and workspaces that can be used in the compiler environment of your choice.
这两段的意思如下:
make这个工具根据makefile文件对工程进行构建。
makefile文件定义构建规则。
cmake是跨平台构建工具,根据一个平台和编译器无关的配置文件(也就是cmakelist.txt)构建,测试并且打包软件。构建的过程会生成本地makefile文件(makefile文件是平台和编译器相关的)。
可以这样理解,cmake是比make更高层的项目构建工具,cmake赋予make跨平台能力。(不知道cmake这个名称是不是 cross-platform make的意思)
最后附上windows安装MinGW的方法:
戳这里