求大神帮忙写个makefile文件

周靖峰 2013-01-30 10:32:52
文件目录如下:
./src/ 这里放.c文件
./include/ 这里放.h文件
./obj/ 这里放.o文件
./app 这个是要生成的可执行文件

本人实在无法理解makefile,更写不出这么复杂的makefile,求高手指点
...全文
269 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
周靖峰 2013-02-04
  • 打赏
  • 举报
回复
大家好,我自己写了一个makefile文件,但是貌似运行有错误,求大神帮忙改改

INCLUDE_DIR = ./include
SRC_DIR = ./src
OBJ_DIR = ./obj

SRCS = $(wildcard SRC_DIR/*.c)
OBJS = $(addprefix OBJ_DIR, $(patsubst %.c, %.o, $(notdir $(SOURCES))))
INCLUDES = $(INCLUDE_DIR)/test.h

.PHONY : all clean MKDIR

all : $(MKDIR) $(OBJS)
	gcc -o main $(OBJS)

MKDIR :
	mkdir $(OBJ_DIR)
	
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
	gcc -o $@ -c $^

clean :
	rm -rf main $(OBJ_DIR)
周靖峰 2013-02-04
  • 打赏
  • 举报
回复
貌似这个功能还挺难的,楼上几位提供的都不是我想要的,还是自己继续研究吧
周靖峰 2013-02-04
  • 打赏
  • 举报
回复
感谢大家支持,终于让我把makefile写出来的,现在结贴了

INCLUDE_DIR = ./include
SRC_DIR = ./src
OBJ_DIR = ./obj
LIB_DIR = ./lib

#OUTPUT = libtest.a
OUTPUT = main
#SRCS = $(wildcard $(SRC_DIR)/*.c)
SRCS = $(SRC_DIR)/main.c
OBJS = $(addprefix $(OBJ_DIR)/, $(patsubst %.c, %.o, $(notdir $(SRCS))))
LIBS = $(wildcard $(LIB_DIR)/*.a)
INCLUDES = $(INCLUDE_DIR)/test.h

MKDIR = mkdir
CC = gcc
CFLAGS = -I $(INCLUDE_DIR)
LDFLAGS = -L $(LIB_DIR)
AR = ar
ARFLAGS = cqs
RM = rm
RMFLAGS = -rf

.PHONY : all clean MKDIR

all : $(OBJ_DIR) $(OUTPUT)

$(OBJ_DIR) :
	$(MKDIR) $@
	
#$(OUTPUT) : $(OBJS)
#	$(AR) $(ARFLAGS) $@ $(OBJS)
$(OUTPUT) : $(OBJS) $(LIBS)
	$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
	
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c $(INCLUDES)
	$(CC) $(CFLAGS) -o $@ -c $<

clean :
	$(RM) $(RMFLAGS) $(OBJ_DIR) $(OUTPUT)
ForestDB 2013-02-04
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
用automake工具吧
sfd1234 2013-02-01
  • 打赏
  • 举报
回复
我只会写简单的makefile!!!!
wuyg719 2013-02-01
  • 打赏
  • 举报
回复
makefile文件其实非常简单,网上有无数的资源,但是要特别小心里面的缩进,所有的缩进必须是一个TAB,不能用空格代替,初学的人常常被这个搞死,比如 $(TARG_OBJ):$(OBJ_FILES) $(CC) -o $@ $^ $(LIB_ALL) $(CC)前面必须是一个TAB
赵4老师 2013-01-30
  • 打赏
  • 举报
回复
搜“跟我一起写makefile”
Joseph_ 2013-01-30
  • 打赏
  • 举报
回复
自己修改下 这个是通用的makefile 改下目录 库文件

# Makefile for vod
CC = gcc
LIB_PATH := ./lib
SRC_PATH := ./src
INC_PATH := ./inc
MXML_INC_PATH := ./lib/mxml
ALL_INC_PATH := -I$(INC_PATH) -I$(MXML_INC_PATH)
CFLAGS := -Wall -g $(ALL_INC_PATH)
LIB_ALL = -lpthread -L$(LIB_PATH) -lmxml
SRC_FILES = $(wildcard $(SRC_PATH)/*.c)
OBJ_FILES = $(patsubst %.c, %.o, $(SRC_FILES))
TARG_OBJ = vod
DEPS_FILE = makefile.deps

all:$(TARG_OBJ) $(DEPS_FILE)

$(TARG_OBJ):$(OBJ_FILES)
	$(CC) -o $@ $^ $(LIB_ALL)
		
$(DEPS_FILE):$(SRC_FILES)
	$(CC) -MM $(ALL_INC_PATH) $^ > $(DEPS_FILE)

-include $(DEPS_FILE)


.PHONY:libs
libs:
	cd $(LIB_PATH)&&$(MAKE)
	
.PHONY:cleanlibs
cleanlibs:
	cd $(LIB_PATH)&&$(MAKE) clean


.PHONY:clean
clean:
	-rm -f $(OBJ_FILES) $(DEPS_FILE)
sniffer12345 2013-01-30
  • 打赏
  • 举报
回复
搜一下,出来这篇文章:http://bbs.chinaunix.net/thread-3553668-1-1.html 再自己改改 ############################################################################### # # A smart Makefile template for GNU/LINUX programming # # Author: PRC (ijkxyz AT msn DOT com) # Date: 2011/06/17 # # Usage: # $ make Compile and link (or archive) # $ make clean Clean the objectives and target. ############################################################################### CROSS_COMPILE = OPTIMIZE := -O2 WARNINGS := -Wall -Wno-unused -Wno-format DEFS := EXTRA_CFLAGS := INC_DIR = include SRC_DIR = src OBJ_DIR = obj EXTRA_SRC = EXCLUDE_FILES = SUFFIX = c cpp cc cxx TARGET := app/app #TARGET_TYPE := TARGET_TYPE := #TARGET_TYPE := ##################################################################################### # Do not change any part of them unless you have understood this script very well # # This is a kind remind. # ##################################################################################### #FUNC# Add a new line to the input stream. define add_newline $1 endef #FUNC# set the variable `src-x' according to the input $1 define set_src_x src-$1 = $(filter-out $4,$(foreach d,$2,$(wildcard $d/*.$1)) $(filter %.$1,$3)) endef #FUNC# set the variable `obj-x' according to the input $1 define set_obj_x obj-$1 = $(patsubst %.$1,$3%.o,$(notdir $2)) endef #VAR# Get the uniform representation of the object directory path name ifneq ($(OBJ_DIR),) prefix_objdir = $(shell echo $(OBJ_DIR)|sed 's:\(\./*\)*::') prefix_objdir := $(filter-out /,$(prefix_objdir)/) endif GCC := $(CROSS_COMPILE)gcc G++ := $(CROSS_COMPILE)g++ SRC_DIR := $(sort . $(SRC_DIR)) inc_dir = $(foreach d,$(sort $(INC_DIR) $(SRC_DIR)),-I$d) #--# Do smart deduction automatically $(eval $(foreach i,$(SUFFIX),$(call set_src_x,$i,$(SRC_DIR),$(EXTRA_SRC),$(EXCLUDE_FILES)))) $(eval $(foreach i,$(SUFFIX),$(call set_obj_x,$i,$(src-$i),$(prefix_objdir)))) $(eval $(foreach f,$(EXTRA_SRC),$(call add_newline,vpath $(notdir $f) $(dir $f)))) $(eval $(foreach d,$(SRC_DIR),$(foreach i,$(SUFFIX),$(call add_newline,vpath %.$i $d)))) all_objs = $(foreach i,$(SUFFIX),$(obj-$i)) all_srcs = $(foreach i,$(SUFFIX),$(src-$i)) CFLAGS = $(EXTRA_CFLAGS) $(WARNINGS) $(OPTIMIZE) $(DEFS) TARGET_TYPE := $(strip $(TARGET_TYPE)) ifeq ($(filter $(TARGET_TYPE),so ar app),) $(error Unexpected TARGET_TYPE `$(TARGET_TYPE)') endif ifeq ($(TARGET_TYPE),so) CFLAGS += -fpic -shared LDFLAGS += -shared endif PHONY = all .mkdir clean all: .mkdir $(TARGET) define cmd_o $(obj-$1): $2%.o: %.$1 $(MAKEFILE_LIST) $(GCC) $(inc_dir) -Wp,-MT,$@ -Wp,-MMD,$@.d $(CFLAGS) -c -o $@ $< endef $(eval $(foreach i,$(SUFFIX),$(call cmd_o,$i,$(prefix_objdir)))) ifeq ($(TARGET_TYPE),ar) $(TARGET): AR := $(CROSS_COMPILE)ar $(TARGET): $(all_objs) rm -f $@ $(AR) rcvs $@ $(all_objs) else $(TARGET): LD = $(if $(strip $(src-cpp) $(src-cc) $(src-cxx)),$(G++),$(GCC)) $(TARGET): $(all_objs) $(LD) $(LDFLAGS) $(all_objs) -o $@ endif .mkdir: @if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi clean: rm -f $(prefix_objdir)*.o $(TARGET) -include $(patsubst %.o,%.o.d,$(all_objs)) .PHONY: $(PHONY)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧