makefile

本文深入探讨了Makefile的编写技巧,包括如何设置编译器、链接器路径,定义目标文件、源文件,以及实现自动依赖关系解析。通过具体实例,展示了如何在多目录环境下进行高效编译,同时提供了头文件依赖关系的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例Makefile

 #rule.make

CC=g++
MAKE=make
AR=ar cr
RM=rm -rf

#CFLAGS+=-Wall

OBJDIR=.out
SRCSCPP=$(wildcard *.cpp)
SRCSC=$(wildcard *.c)
OBJS=$(SRCSCPP:%.cpp=$(OBJDIR)/%.o) $(SRCSC:%.c=$(OBJDIR)/%.o)
DEPENDS=$(SRCSCPP:%.cpp=$(OBJDIR)/%.d) $(SRCSC:%.c=$(OBJDIR)/%.d)

.PONEY: clean  all

all:$(TARGET)  $(LIB) subdirs $(DEPENDS)

$(LIB):$(OBJS) 
    @mkdir -p $(LIBPATH)
    @$(AR)  $(LIBPATH)/$@  $^
    @echo create $@

$(TARGET):$(OBJS)
    @mkdir -p $(EXEPATH)
    @$(CC) -o $(EXEPATH)/$@ $^ $(LDFLAGS)
    @echo create $@

subdirs:$(SUBDIRS)
    @for dir in $(SUBDIRS);\
    do $(MAKE) -C $$dir all||exit 1;\
    done

$(OBJDIR)/%.o:%.cpp $(OBJDIR)/%.d
    @mkdir -p $(OBJDIR)
    @$(CC) -c $< -o $@ $(CFLAGS)
    @echo "Compile $<"

$(OBJDIR)/%.o:%.c $(OBJDIR)/%.d
    @mkdir -p $(OBJDIR)
    @$(CC) -c $< -o $@ $(CFLAGS)
    @echo "Compile $<"

#-include $(DEPENDS)

$(OBJDIR)/%.d:%.c
    @mkdir -p $(OBJDIR)
    @set -e; rm -f $@;\
    $(CC) -MM $(CFLAGS) $< > $@.$$$$;\
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\
    rm -f $@.$$$$

$(OBJDIR)/%.d:%.cpp
    @mkdir -p $(OBJDIR)
    @set -e; rm -f $@;\
    $(CC) -MM $(CFLAGS) $< > $@.$$$$;\
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\
    rm -f $@.$$$$

clean:
    @for dir in $(SUBDIRS);\
    do \
    echo "clean dir $$dir";\
    $(MAKE) -C $$dir clean||exit 1;\
    done
    @-$(RM) $(TARGET) $(LIB)  $(OBJDIR)

#Makefile lib

TOPDIR=..

LIB=libsourcecmd.a

LIBPATH=$(TOPDIR)/.lib/

CFLAGS= -I./\
        -I../../comm/libs/utils\
        -I../../comm/libs3/mysql/include\
        -I../../comm/libs3\
        -I../../comm/libs3/libuv-1.x/include


include $(TOPDIR)/rules.make

 

#Makefile exe

TOPDIR=..

TARGET=cmu

EXEPATH=$(TOPDIR)/bin

LIBPATH=-L$(TOPDIR)/.lib\
        -L../../comm/libs3/libuv-1.x/.libs\
        -L../../comm/share/.lib\
        -L../../comm/libs/asio/.lib\
        -L../../comm/libs/db/.lib\
        -L/usr/lib64/mysql

CFLAGS= -I./\
        -I../../comm/libs/utils\
        -I../../comm/libs3/mysql/include\
        -I../../comm/libs3\
        -I../../comm/libs3/libuv-1.x/include
        
        
LDFLAGS= $(LIBPATH) -lsourcecmd -lsourcedb -ldb -lasio -lshare -lm -ldl -lpthread -luv -lmysqlclient


include $(TOPDIR)/rules.make

 

 

说明:

include $(DEPENDS)包含头文件依赖文件很多事是会导致反应慢和两次进入子目录问题

 

 

一个直接编译多个目录下文件的makefile

CC=g++
MAKE=make
AR=ar cr
RM=rm -rf

#CFLAGS+=-Wall

LIBPATH=-L../comm/libs3/libuv-1.x/.libs\
        -L../comm/share/.lib\
        -L../comm/libs/asio/.lib\
        -L../comm/libs/db/.lib\
        -L/usr/lib64/mysql

CFLAGS= -I./\
        -I../comm/libs/utils\
        -I../comm/libs3/mysql/include\
        -I../comm/libs3\
        -I../comm/libs3/libuv-1.x/include
        
LDFLAGS= $(LIBPATH) -lm -ldl -lpthread -luv -lmysqlclient        

SRCSCPP=$(wildcard ../comm/libs/asio/*.cpp)\
        $(wildcard ../comm/libs/db/*.cpp)\
        $(wildcard ../comm/share/*.cpp)\
        $(wildcard sourcecmd/*.cpp)\
        $(wildcard sourcedb/*.cpp)\
        $(wildcard source/*.cpp)


OBJS=$(SRCSCPP:%.cpp=%.o) 

TARGET=test

all:$(TARGET) 


$(TARGET):$(OBJS)
    @$(CC) -o $(EXEPATH)/$@ $^ $(LDFLAGS)
    @echo create $@


%.o:%.cpp 
    @$(CC) -c $< -o $@ $(CFLAGS)
    @echo "Compile $<"


clean:
    @-$(RM) $(TARGET) $(OBJS) 

 

 头文件依赖关系另外的写法:

%.d:%.cpp
    $(GCC) -MM -MT "$*.o $*.d" $(INCS) $< >$@

 

文件排除

SRC := $(filter-out a.cpp b.cpp, $(SRC))

 

 

 参考:

头文件依赖关系

https://blog.youkuaiyun.com/dragon101788/article/details/30580349

层级makefile

https://www.cnblogs.com/coderkian/p/3479564.html

转载于:https://www.cnblogs.com/mingzhang/p/11308337.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值