linux学习笔记——在ubuntu系统下编译运行c程序并使用makefile管理项目
今天要运行一个工程,该工程用C/C++写的,在一个.c文件里,并且还有一个makefile文件。
先来看一下编译运行c程序的基本命令。
虽然刚装好的系统中已经有GCC了,但是这个GCC什么文件都不能编译,
因为缺少一些必须的头文件,所以要安装build-essential这个软件包。
输入命令:
sudo apt-get install build-essential
其中:
sudo 是linux系统上“以超级用户身份运行”的意思,允许系统管理员让普通用户执行一些root命令。
apt是一种包管理工具,后面的 install是告诉我想用apt安装某一个软件包 。
build-essential是c语言的开发包,包含了gcc make gdb和libc函数库。
安装完成后写一个 C 语言程序 hello.c 测试一下:
#include<stdio.h>
int main()
{
printf("Hello Ubuntu!\n");
return 0;
}
在终端输入命令编译程序:
gcc hello.c -o hello
注意,如果不写-o hello,默认会生成a.out文件,选项 -o 用来指定所生成的可执行程序的文件名。
建议在后面加上-o hello来重命名生成文件的名称。
运行生成的文件的命令如下:
./hello
显示
Hello Ubuntu!
这样,C 语言编译器就算是安装成功了。
如果使用Eclipse for C++遇到问题binary not found,是因为没有编译成功,
使用ctrl+B或者点击菜单栏的build all即可。
如果出现gmake未定义 的问题,su切换到root权限之后,在终端输入一下命令即可:
ln -s /usr/bin/make /usr/bin/gmake
什么是Makefile
接下来是关于Makefile的内容。
MakeFile可以简单的理解为是一个项目管理的工具。
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
首先,用一个示例来说明Makefile的书写规则。
这个示例来源于GNU的make使用手册,在这个示例中,工程有8个C文件,和3个头文件,
我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。
规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,
make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,
从而自己编译所需要的文件和链接目标程序。
Makefile的规则很简单:
target ... : prerequisites ...
command
...
...
其中,
target也就是一个目标文件,可以是Object File,也可以是执行文件。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
这是一个文件的依赖关系。
也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。
换句话说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。
这就是Makefile的规则。也就是Makefile中最核心的内容。