编写一个makefile的简单实例

说明:执行的环境ubuntu 12.04 + gcc

1.编写源代码(5个文件)

1)名称为main.c,代码如下:

#include "my1.h"
#include "my2.h"
int main()
{
     my1_print("hello my1!");
     my2_print("hello my2!");
    return 0;
}

2)名称为my1.h,代码如下:

#ifndef _MY_1_H
#define _MY_1_H

void my1_print(char *print_str);

#endif

3)名称为my2.h,代码如下:

#ifndef _MY_2_H
#define _MY_2_H

void my2_print(char *print);

#endif 

4)名称为my1.c,代码如下:

#include "my1.h"
#include <stdio.h>

void my1_print(char *print_str)
{
    printf("This is my2 print %s\n", print_str);
}

5)名称为my2.c,代码如下:

#include "my2.h"
#include <stdio.h>

void my2_print(char *print_str)
{
    printf("This is my2 print %s\n", print_str);
}

2.编写makefile文件,名称为makefile(或者Makefile),内容如下:

main:main.o my1.o my2.o
    gcc -o main main.o my1.o my2.o
main.o:main.c my1.h my2.h
    gcc -c main.c
my1.o:my1.c my1.h
    gcc -c my1.c
my2.o:my2.c my2.h
    gcc -c my2.c
clean:
    rm -f *.o main

3.执行makefile文件。

3.1执行命令如下:

make

3.2输出结果如下:

gcc -c main.c
gcc -c my1.c
gcc -c my2.c
gcc -o main main.o my1.o my2.o

4.最后查看和执行生成文件main。

file ./main

输出的结果为:

./main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x2c63c471957d709e4d5a19c75c7eda60cfb2f3e2, not stripped

./main

输出的结果为:

This is my2 print hello my1!
This is my2 print hello my2!

维基百科介绍:

在软件开发中,make是一个工具程序(Utility software),经由读取叫做“makefile”的文件,自动化建构软件。它是一种转化文件形式的工具,转换的目标称为“target”;与此同时,它也检查文件的依赖关系,如果需要的话,它会调用一些外部软件来完成任务。它的依赖关系检查系统非常简单,主要根据依赖文件的修改时间进行判断。大多数情况下,它被用来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。它使用叫做“makefile”的文件来确定一个target文件的依赖关系,然后把生成这个target的相关命令传给shell去执行。

转载于:https://www.cnblogs.com/missliuxin/p/3540531.html

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
############################################################################# # Makefile for building: sample 2011-09-26 # # Project: # Template: # Command: # ------基本上简单用法的makefile------- #1. 第一个目标为最终目标 #2. 命令以 Tab开头,可以有多个命令 #3. 分行号\ 后面不可以跟空格 #4、加@可以去掉命令显示 #5. 变量为 abc = efd 访问为 $(abc) echo $abc # # # #缺点,单文件夹 #每次都会重新生成 # #foo.o : foo.c defs.h # foo模块 #cc -c -g foo.c # #多目录 一种方法,在主目录里面include "",然后其里面OBJS += .o,这样其实就是 或用foreach ############################################################################# #target EXECUTABLE := test CC := gcc CXX := g++ STRIP := strip AR := ar cqs LINK := g++ RM := rm -f CFLAGS := -g -Wall CXXFLAGS := $(CFLAGS) CXXFLAGS += -MD LIBS := -lm LIBPATH := -L/usr/local/lib INCPATH := ####### Output directory OBJSPATH := ../Obj/ EXECUTABLEPATH := ../Execute/ #######source Files SOURCE := $(wildcard *.c) $(wildcard *.cpp) OBJS := $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(SOURCE))) DEPS := $(patsubst %.o,%.d,$(OBJS)) #######rule .SUFFIXES: .cpp .c .o .so .a .d $(OBJSPATH)%.o:%.c $(CC) $(CFLAGS) -c $< -o $@ $(OBJSPATH)%.o:%.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ $(OBJSPATH)%.d:%.cpp $(CXX) -MM $ $@ ######main .PHONY : all deps objs clean rebuild all: $(EXECUTABLE) $(CXX) $(CXXFLAGS) $(INCLUDEPATH) $(LIBS) $(LIBPATH) $(addprefix $(OBJSPATH),$(OBJS)) \ -o $(EXECUTABLEPATH)$(EXECUTABLE) deps: $(addprefix $(OBJSPATH),$(DEPS)) objs: $(addprefix $(OBJSPATH),$(OBJS)) clean: @$(RM) $(OBJSPATH)*.o @$(RM) $(OBJSPATH)*.d @$(RM) $(EXECUTABLEPATH)$(EXECUTABLE) rebuild: clean all -include $(addprefix $(OBJSPATH),$(DEPS)) ##.d里面是详细的.o rule 自己会括展开的,然后没有文件就自己去重建 $(EXECUTABLE) : objs

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值