博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一步一步写一个简单通用的makefile(二)
阅读量:7049 次
发布时间:2019-06-28

本文共 4287 字,大约阅读时间需要 14 分钟。

这一篇源代码沿用上一篇的源代码hellomake.c hellofunc.c hellofunc.h makefile

 但是代码内容和结构有变化,如下:

.├── include│   └── hellofunc.h├── makefile└── src    ├── hellofunc.c    └── hellomake.c

hellomake.c 代码:

#include"../include/hellofunc.h"#include
void myPrintHelloMake(void) { printf("Hello makefiles!\n"); return;}

hellofunc.c代码:

#include"../include/hellofunc.h"#include
void myPrintHelloMake(void) { printf("Hello makefiles!\n"); return;}

hellofunc.h代码:

/*example include file*/void myPrintHelloMake(void);

makefile 文件代码:

#Hellomake#Magnum, 2014-10-19# 指令编译器和选项  CC=gcc  CFLAGS=-Wall LIBS=-lmIncludeDir = -I./hellofunc/LinkDir = -LOBJ_DIR = ./objBIN_DIR = ./binPROJECT_TOP_DIR=.#$(shell pwd)  #$(shell cd ../; pwd)  PROJECT_BIN_DIR=./bin  PROJECT_SRC_DIR=./src  PROJECT_LIB_DIR=./lib  PROJECT_OBJ_DIR=./objs  MKDIR := mkdir -p  # 目标文件  TARGET=$(BIN_DIR)/hellomakesrc=$(wildcard ./src/*.c)  dir= $(notdir $(src))  PROJECT_OBJ= $(patsubst %.c,%.o,$(dir) )  PROJECT_ALL_OBJS= $(addprefix ./objs/, $(PROJECT_OBJ))$(TARGET): $(PROJECT_ALL_OBJS)    $(CC) -o $@ $^ $(LIBS)    .PHONY : cleanclean:      -rm -rf $(TARGET) $(PROJECT_ALL_OBJS)./objs/%.o:./src/%.c      @if test ! -d $(PROJECT_OBJ_DIR) ; \        then \        mkdir $(PROJECT_OBJ_DIR) ; \    fi    @if test ! -d $(PROJECT_BIN_DIR) ; \        then \        mkdir $(PROJECT_BIN_DIR) ; \    fi    $(CC) $(CFLAGS) -o $@ -c $<

makefile执行命令的部分记得改为tab而不是空格,否则会报错。

执行make,结果如下:

.├── bin│   └── hellomake├── include│   └── hellofunc.h├── makefile├── objs│   ├── hellofunc.o│   └── hellomake.o└── src    ├── hellofunc.c    └── hellomake.c4 directories, 7 files

这里面课执行文件放在拉bin文件夹中,而中间.o文件全部放在objs文件夹内。

执行命令"./bin/hellomake"得到:

Hello makefiles!Value:2.708050

 

可以发现hellomake.c 和 hellofunc.c 在引入头文件的地方有变化,其他内容还是和之前的一样。

也可以这样修改:

hellomake.c:

//#include "../include/hellofunc.h"#include
#include
#include
int main() { // call a function in another file myPrintHelloMake(); double value =15; printf("Value:%f\n",log(value)); return(0);}

hellofunc.c:

//#include"../include/hellofunc.h"#include
#include
void myPrintHelloMake(void) { printf("Hello makefiles!\n"); return;}

makefile:

#Hellomake#Magnum, 2014-10-19# 指令编译器和选项  CC=gcc  CFLAGS=-Wall LIBS=-lmIncludeDir = -I./include/LinkDir = -LOBJ_DIR = ./objBIN_DIR = ./binPROJECT_TOP_DIR=.#$(shell pwd)  #$(shell cd ../; pwd)  PROJECT_BIN_DIR=./bin  PROJECT_SRC_DIR=./src  PROJECT_LIB_DIR=./lib  PROJECT_OBJ_DIR=./objs  MKDIR := mkdir -p  # 目标文件  TARGET=$(BIN_DIR)/hellomakesrc=$(wildcard ./src/*.c)  dir= $(notdir $(src))  PROJECT_OBJ= $(patsubst %.c,%.o,$(dir) )  PROJECT_ALL_OBJS= $(addprefix ./objs/, $(PROJECT_OBJ))$(TARGET): $(PROJECT_ALL_OBJS)    $(CC) -o $@ $^ $(LIBS) .PHONY : cleanclean:      -rm -rf $(TARGET) $(PROJECT_ALL_OBJS)./objs/%.o:./src/%.c      @if test ! -d $(PROJECT_OBJ_DIR) ; \        then \        mkdir $(PROJECT_OBJ_DIR) ; \    fi    @if test ! -d $(PROJECT_BIN_DIR) ; \        then \        mkdir $(PROJECT_BIN_DIR) ; \    fi    $(CC) $(CFLAGS) -o $@ -c $< $(IncludeDir)

进一步优化makefile:

 

#Hellomake

#Magnum, 2014-10-19
# 指令编译器和选项
CC=gcc
CFLAGS=-Wall
LIBS=-lm
IncludeDir = -I./include/
LinkDir = -L
OBJ_DIR = ./obj
BIN_DIR = ./bin
PROJECT_TOP_DIR=$(shell pwd)#$(shell cd ../; pwd)
PROJECT_BIN_DIR=./bin
PROJECT_SRC_DIR=./src
PROJECT_LIB_DIR=./lib
PROJECT_OBJ_DIR=./objs
MKDIR := mkdir -p

 

# 目标文件

TARGET=$(BIN_DIR)/hellomake

 

src=$(wildcard $(PROJECT_SRC_DIR)/*.c)

dir= $(notdir $(src))
PROJECT_OBJ= $(patsubst %.c,%.o,$(dir) )
PROJECT_ALL_OBJS= $(addprefix $(PROJECT_OBJ_DIR)/, $(PROJECT_OBJ))

 

all: chdir $(TARGET)

 

$(TARGET): $(PROJECT_ALL_OBJS)

$(CC) -o $@ $^ $(LIBS)

 

chdir:

@if test ! -d $(PROJECT_OBJ_DIR) ; \
then \
mkdir $(PROJECT_OBJ_DIR) ; \
fi

 

@if test ! -d $(PROJECT_BIN_DIR) ; \

then \
mkdir $(PROJECT_BIN_DIR) ; \
fi

 

.PHONY : clean

clean:
-rm -rf $(TARGET) $(PROJECT_ALL_OBJS)

 

./objs/%.o:./src/%.c

$(CC) $(CFLAGS) -o $@ -c $< $(IncludeDir)

 

 

执行make也能得到正确的结果, "-I"指定啦编译的时候系统搜索头文件的系统路径首先是"-I"后面的路径,然后才是/usr/include 之类的。

 

提示: makefile文件结束后请删除不必要的空格,很可能你google 超久最后就是由于这些多余的空格引起的。

关于下面这部分代码不懂的,可以百度,网上有很多详细的解释:

src=$(wildcard ./src/*.c)

dir= $(notdir $(src))
PROJECT_OBJ= $(patsubst %.c,%.o,$(dir) )
PROJECT_ALL_OBJS= $(addprefix ./objs/, $(PROJECT_OBJ))

转载地址:http://fadol.baihongyu.com/

你可能感兴趣的文章
three.js模型
查看>>
网络流24题 餐巾计划问题
查看>>
基于 Android NDK 的学习之旅-----序言
查看>>
hdoj-3371-Connect the Cities【最小生成树】
查看>>
SSL和SSH的差别
查看>>
使用AutoMapper实现Dto和Model的自由转换(中)
查看>>
用异或操作实现的交换函数用以实现数组逆置中须要注意的问题
查看>>
Tomcat的URL中文乱码解决以及传输优化
查看>>
【POI】修改已存在的xls,新添一列后,再保存本文件
查看>>
mac nginx 安装教程
查看>>
小贝_mysql 触发器使用
查看>>
jstree中json data 的生成
查看>>
Win7 64bit 安装VisualSVN出现报错:Servic &#39;VisualSVN Server&#39; failed to start.解决的方法...
查看>>
论-多租户技术
查看>>
解析json方式之net.sf.json
查看>>
java中集合格式及json格式的特点和转换
查看>>
Java下用Jackson进行JSON序列化和反序列化(转)
查看>>
input_shape { dim: 1 dim: 3 dim: 224 dim: 224 }
查看>>
15.extjs tabPanel的用法
查看>>
NetFlow是一种数据交换方式,提供网络流量的会话级视图,记录下每个TCP/IP事务的信息...
查看>>