linux 一般Makefile的简单记录

大部分人都编写过makefile,主要是一些模块的组合成一个大应用。分模块可以先编译成.a或者.so等链接的时候 在连接过去。

先写一个平时自己用的so makefile记录下。

GXX = g++ -ggdb
GCC = gcc -ggdb

ifeq ($(env),Auto)//条件编译
TAG = libxxxso
else
TAG = libxxx.a
endif

GIFLAG=/xxx/xxx/include
src=$(wildcard *.cpp )
dir=$(notdir $(src)) //这里可以加路径 意思是去掉某个路径
obj=$(dir:%.cpp=%.o)

.PHONY: clean install info //伪目标为三个  make clean    ;make install   ;  make info

直接make的话 是匹配不到任何目标所以会走第一个 正是我们需要的

ifeq ($(env),Auto)
$(TAG):$(obj)
# ar x ${GLDFLAG}
gcc -shared -fPIC *.o -o $(TAG)//*.o  如果没有其他文件加入的话 建议 $(obj) 代替
cp -rf $(TAG) ../lib/
else
$(TAG):$(obj)
####ar x ${GLDFLAG}//需要打包进入别的.a话需要放开此选项 然后再制定路径
ar cru $(TAG) *.o//*.o  如果没有其他文件加入的话 建议 $(obj) 代替
ranlib $(TAG)
cp -rf $(TAG) ../lib/
endif

clean:
rm -f $(obj) $(TAG)

install:
@echo "install "

info:
@echo $(src)
@echo $(dir)
@echo $(obj)

最后的可执行程序makefile

GXX = g++ -ggdb
GCC = gcc -ggdb

TAG = httpxxxx
GIFLAG = #-I ./include
GLDFLAG =
GWFLAG = -lpthread -lm -lrt -lxxx

src=$(wildcard *.cpp )
dir=$(notdir $(src))
obj=$(dir:%.cpp=%.o)

.PHONY: clean install info

$(TAG):$(obj)
$(GXX) $(obj) -o $(TAG) ${GLDFLAG} $(GWFLAG) -L ./
rm -rf *.o
$(obj):%.o:%.cpp
$(GXX) -c $< -o $@ ${GIFLAG}

clean:
rm -f $(obj) $(TAG)

install:
@echo "install "

info:
@echo ${GLDFLAG}
@echo $(GWFLAG)
@echo $(GIFLAG)
@echo $(src)
@echo $(dir)
@echo $(obj)

 

复杂一些的makefile编写,先写总体公共需要用到的comMakefile

CC= g++ -g -DBITS64 -D__LINUX__ -DCLOSE_SKT -D_CHECK_RMKEY_MOBILE_ -w -Wall
ifeq ($(env),Auto)
INC=-I.. -I../../include -I/usr/local/include
else
INC=-I.. -I/usr/include -I../../include

all:
cd part1 ; make
cd part2 ; make
cd main; make all;

各个模块makefile

include ../comm_make
TARGET=libpart1.a
SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)
$(TARGET):$(OBJ)
ar r $(TARGET) $(OBJ)
ranlib $(TARGET)
cp $(TARGET) ../../lib
$(OBJ):%.o:%.cpp
$(CC) -c $(INC) $< -o $@
clean:
rm -rf $(OBJ)
rm -rf $(TARGET)

 

总体makefile

include ../comm_make
TARGET1=main1
TARGET2=main2
all : $(TARGET1) $(TARGET2)
.PHONY : all
SYS_LIBS=-lpthread -lrt -lssl
ORA_LIBS=-lclntsh -locci -lrdb_oracle
ifeq ($(env),Auto)
QWER=/data/xxx.a /data/wwwa++.a
else
QWER=/home/www.a
endif
ifeq ($(env),Auto)
LIB_PATH=-L/data/ww/lib -L../../lib -L/wwww/lib
else
LIB_PATH=-L$(HOME)/lib -L../../lib -L/usr/local/lib -L$(WWHOME)/lib
endif
SRC1=main1.cpp
OBJ1=$(SRC1:.cpp=.o)
SRC2=main2.cpp
OBJ2=$(SRC2:.cpp=.o)
$(TARGET1) : $(OBJ1)
$(CC) -o $@ $^ $(INC) $(LIB_PATH) $(QWER)
$(TARGET2) : $(OBJ2)
$(CC) -o $@ $^ $(INC) $(LIB_PATH) $(QWER)
$(OBJ1):%.o:%.cpp
$(CC) -c $(INC) $< -o $@
$(OBJ2):%.o:%.cpp
$(CC) -c $(INC) $< -o $@
clean:
rm -rf $(OBJ1)
rm -rf $(OBJ2)

运行不起来报错,大部分是头文件路径不对,库的路径不对,链接路径跟运行路径是否都对了。这样编译多个模块运行一般都没问题。

 

posted @ 2019-07-02 11:17  xlsss  阅读(258)  评论(0编辑  收藏  举报