Makefile的原理

在我的理解中, Makefile就是让用户在不需要IDE的情况下, 轻松构建代码结构, 但是现在的IDE做了太多了工作, 以至于我们都不了解一个程序是如何被编译, 被链接, 以及被执行的, 对于我们来说, 了解IDE是怎样工作的是很有必要的

VS? NO !!!

VS到底是怎么样实现编译,链接,以及执行我们的代码的吗?

详细过程请看 编译器的工作过程

1
2
3
4
5
cl /EHsc /Femy.exe test.cpp 

# 另一种方式
cl /EHsc /c test.cpp /Fomy.obj #编译过程
link my.obj /OUT:my.exe #链接过程

1
2
3
4
5
6
7
8
9
10
11
12
#define UNICODE
#define _WIN32_WINNT 0x0A00
#include <afxwin.h>
#include "windows.h"

int WINAPI WinMain(HINSTANCE hIstance, HINSTANCE hPrevInstance,
LPSTR szCmdLine, int iCmdShow)
{
AfxMessageBox(_T("Hello world"));
//MessageBox(0, L"Hello MessageBox", L"My app:", MB_SETFOREGROUND);
return 0;
}

gcc 立志成为编译器的标准,它开源就是合适的. vim/emacs 立志成为程序员编辑器的标准,它开源也是合适的, apache 立志成为 web 服务器的标准平台,它开源也是合适的. android 立志成为移动互联网系统的标准平台,它开源就是合适的.

Makefile基础用法

1
2
target... : requisites...
command

这里command 前面的tab是必须的 对于Makefile来说, 行首有tab的是命令

Makefile的高明之处

Makefile的第一大优点:

  • 更改了一个文件之后它不会重新编译整个项目.
  • 而是只是编译更改过的文件(IDE不就是这样吗?)
  • 出现乱码可以用chcp 65001 切换为utf-8编码

第二大优点: 那些阅读源码的人, 可以清晰的从Makefile中观察到程序的构建方式, 某个文件到底是怎样产生的, 如果你只是从IDE中看到那么多的.h, .cpp文件, 就算是大罗神仙也要读许久的.

Makefile中如果 内容很长 可以使用\进行换行 那些规则只告诉make两件事, 文件的依赖关系以及如何生成目标文件

  • 一般来说, make会以UNIX的标准shell, 也就是/bin/sh来执行命令

第三大优点 通用的源码包安装, 大大促进了开源软件的传播, 我们周围, 几乎所有的软件身上都会有开源软件的影子, 而开源软件的爆发与makefile的流行是分不开的, 它极大的简化了程序员的工作

有关C++库的使用

请下载例子程序

SharedLibDynamicLink.tar.gz

$^:代表所有的依赖文件

$@:代表目标

$<:代表第一个依赖文件

稍微复杂一点的程序示例

MyDict.tar.gz

最后, 我再来介绍一下Linux中的三行情诗

1
2
3
./configure 
make
make install
1
2
3
wget http://ftp.gnu.org/gnu/tar/tar-latest.tar.xz       # 下载tar的源码包
xz -d tar-latest.tar.xz
tar -xvf tar-latest.tar

一些简单的指导文档

Makefile.pdf

CMake Practice.pdf

大家如果对LFS感兴趣, 也有一定的Linux操作基础, 可以下载文档来试一下 LFS下载地址