Linux 下用Makefile编译项目

[cpp]
//main.cpp
#include "functions.h"   
  
int main()  
  
{   
  
    print_hello();   
  
    cout << endl;   
  
    cout << "The factorial of 5 is " << factorial(5) << endl;   
  
    return 0;   
  
}   
  
  
  
///hello.cpp   
  
#include "functions.h"   
  
void print_hello()  
  
{   
  
    cout << "Hello World!";   
  
}   
  
  
  
///factorial.cpp  
  
#include "functions.h"   
  
int factorial(int n)  
  
{   
  
    if(n!=1)  
  
    {
         return(n * factorial(n-1)); 
    }   
  
    else 
        return 1;   
  
}   
  
//functions.h  
  
void print_hello();  
  
int factorial(int n); 

请将以上文件放到一个目录下。

make 的作用

如果你运行:make命令, 它将会自动的在你的目录下寻找makefile文件,然后执行它,如果你几个makefile文件,你可以指定某一个特定的makefile文件,如mymakefile,使用如下命令:

make -f  mymakefile

想知道更多的make 用法,可以执行man  make 命令。

记住不管任何时候,man都是我们最好的帮手!

执行过程

  1. 编译器将会编译你的源文件,然后输出目标文件
  2. 链接器执行目标文件然后创建一个可执行文件
手动编译  
 

最不理想的一种执行方式就是

 g++ main.cpp hello.cpp factorial.cpp -o hello

但是这也是可行的,在程序较少时,手动编译就可以满足需求。

makefile 基本规则

基本规则是有以下构成:

target: dependencies

[tab] system command

利用以上语法编写如下       

all:

        g++main.cpp hello.cpp factorial.cpp -o hello

然后运行你的makefile,如下

make -f Makefile-1

如上代码叙述,所写的目标是all,all是makefile默认的目标,如果没有其他规定,make语法将要执行这个目标文件。

我们还发现,all目标并没有依赖的,所以按照命令让他安全的执行。

最后,make通过我们给的命令进行编译程序

使用依赖

这是因为,如果你修改一个单独的文件在你的项目,你不必重新编译一切,只有你修改。请看下边的例子

all: hello  
  
hello: main.o factorial.o hello.o  
    g++ main.o factorial.o hello.o -o hello  
  
main.o: main.cpp  
    g++ -c main.cpp  
  
factorial.o: factorial.cpp  
    g++ -c factorial.cpp  
  
hello.o: hello.cpp  
    g++ -c hello.cpp  
  
clean:  
    rm -rf *o hello  

我们看到目标all只有依赖,没有系统命令。为了去执行正确,它必须满足所有的目标所依赖的。目标都回去搜索所有的依赖,然后去执行它。

在例子中,我们看到了clean的目标,clean这个目标就是清除中间生成的.o文件和那些可执行文件。

使用变量和注释

当你写makefile文件的时候,当你想改变一些编译的一些选项的时候,他是非常有用处的。

# 这是注释,CC 编译器.  
 CC=g++  
# CFLAGS  是选项  
CFLAGS=-c -Wall  
#  目标文件  
OBJECTS=main.o factorial.o hello.o  
all: hello  
  
hello: $(OBJECTS)     
    $(CC) main.o factorial.o hello.o -o hello  
  
main.o: main.cpp  
    $(CC) $(CFLAGS) main.cpp  
  
factorial.o: factorial.cpp  
    $(CC) $(CFLAGS) factorial.cpp  
  
hello.o: hello.cpp  
    $(CC) $(CFLAGS) hello.cpp  
  
clean:  
    rm -rf *o hello  

你可以看到,使用这些有时候是非常有用的。你可以使用它们,赋值,当你想改变一些变量值的时候,然后你可以使用$(var)来应用这些变量。

如何继续下去

通过以上简要的介绍,你就可以简要的去编写一些更加复杂的makefile来运行你的复杂的程序了。上边讲的只是冰山一角,你可以通过查一些make的文档来编写更加细致的编译工作。

CC=g++  
CFLAGS=-c -Wall  
LDFLAGS=  
SOURCES=main.cpp hello.cpp factorial.cpp  
OBJECTS=$(SOURCES:.cpp=.o)  
EXECUTABLE=hello  
  
all: $(SOURCES) $(EXECUTABLE)  
      
$(EXECUTABLE): $(OBJECTS)   
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@  
  
.cpp.o:  
    $(CC) $(CFLAGS) {1}lt; -o $@  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值