今天要运行一个工程,该工程用C/C++写的,在一个.c文件里,而且还有一个makefile文件。
linux
先来看一下编译运行c程序的基本命令。web
虽然刚装好的系统中已经有GCC了,可是这个GCC什么文件都不能编译,svg
由于缺乏一些必须的头文件,因此要安装build-essential这个软件包。
输入命令:函数
sudo apt-get install build-essential
其中:工具
sudo 是linux系统上“以超级用户身份运行”的意思,容许系统管理员让普通用户执行一些root命令。测试
apt是一种包管理工具,后面的 install是告诉我想用apt安装某一个软件包 。ui
build-essential是c语言的开发包,包含了gcc make gdb和libc函数库。spa
安装完成后写一个 C 语言程序 hello.c 测试一下:code
#include<stdio.h>
int main()
{
printf("Hello Ubuntu!\n");
return 0;
}
在终端输入命令编译程序:xml
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能够简单的理解为是一个项目管理的工具。
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中最核心的内容。