怎么在ubuntu在编辑makefile文件
1个回答
推荐于2017-09-21 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517196
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
当我们写的程序文件比较少的时候,敲入gcc
/g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷。linux有一个自带的make命令,它让你的工作省去了很大的力气,但是你要学习如何编写makefile文件。
makefile是一种特殊的文件格式,他将会帮你自动管理你的项目,很强大。
下面通过实例一步步讲解如何使用makefile。下面的四段代码。
[cpp] view
plaincopyprint?
/////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);
/////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);
请将以上文件放到一个目录下。
请注意: 我用的是g++进行编译的,你也可以按照你自己的选择来编译程序
make的作用
如果你运行: make命令,
它将会自动的在你的目录下寻找makefile文件,然后执行它,如果你几个makefile文件,你可以指定某一个特定的makefile文件
使用如下命令:
make -f mymakefile
如果你想知道更多的make 用法,可以执行man make 命令
执行过程
编译器将会编译你的源文件,然后输出目标文件
链接器执行目标文件然后创建一个可执行文件。
手动编译
最不理想的一种执行方式就是
g++ main.cpp hello.cpp factorial.cpp -o hello
akefile 基本规则
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 通过 我们给的命令进行编译程序
使用依赖
这是因为,如果你修改一个单独的文件在你的项目,你不必重新编译一切,只有你修改。 请看下边的例子
[plain] view
plaincopyprint?
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: 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文件和那些可执行文件
使用变量和注释
当你写makefil文件的时候,当你想改变一些编译的一些选项的时候,他是非常有用处的。
[plain] view
plaincopyprint?
# 这是注释,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
# 这是注释,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的文档来写。
[plain] view
plaincopyprint?
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 $@
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 $@
通过以上简要的介绍,你就可以简要的去编写一些更加复杂的makefile来运行你的复杂的程序了。上边讲的只是冰山一角
,你可以通过差一些make的文档来写。
/g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷。linux有一个自带的make命令,它让你的工作省去了很大的力气,但是你要学习如何编写makefile文件。
makefile是一种特殊的文件格式,他将会帮你自动管理你的项目,很强大。
下面通过实例一步步讲解如何使用makefile。下面的四段代码。
[cpp] view
plaincopyprint?
/////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);
/////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);
请将以上文件放到一个目录下。
请注意: 我用的是g++进行编译的,你也可以按照你自己的选择来编译程序
make的作用
如果你运行: make命令,
它将会自动的在你的目录下寻找makefile文件,然后执行它,如果你几个makefile文件,你可以指定某一个特定的makefile文件
使用如下命令:
make -f mymakefile
如果你想知道更多的make 用法,可以执行man make 命令
执行过程
编译器将会编译你的源文件,然后输出目标文件
链接器执行目标文件然后创建一个可执行文件。
手动编译
最不理想的一种执行方式就是
g++ main.cpp hello.cpp factorial.cpp -o hello
akefile 基本规则
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 通过 我们给的命令进行编译程序
使用依赖
这是因为,如果你修改一个单独的文件在你的项目,你不必重新编译一切,只有你修改。 请看下边的例子
[plain] view
plaincopyprint?
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: 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文件和那些可执行文件
使用变量和注释
当你写makefil文件的时候,当你想改变一些编译的一些选项的时候,他是非常有用处的。
[plain] view
plaincopyprint?
# 这是注释,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
# 这是注释,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的文档来写。
[plain] view
plaincopyprint?
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 $@
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 $@
通过以上简要的介绍,你就可以简要的去编写一些更加复杂的makefile来运行你的复杂的程序了。上边讲的只是冰山一角
,你可以通过差一些make的文档来写。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询