因AIX下的Makefile目前还不支持Makefile函数,如果将Linux下的Makefile放入AIX系统下,会出现很多莫名其妙的错误。因此,很有必要总结一下AIX下Makefile的使用场景:
一、编译多个C文件生成可执行文件
如:test.h test.c main.c->main可执行文件
CC = cc
CFLAGS = -q64
INCLUDE = -I. \
-I$(HOME)/incl \
-I$(HOME)/src/incl
LIB_PATH = -L. \
-L$(HOME)/lib \
-L/usr/lib
LIB_LIST = -lbase -lxml -lpkg #(注:这里的动态链接库必须在LD_LIBRARY_PATH的指定路径下,否则会报找不到动态链接库)
OBJS = test.o main.o
TARGET = main
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(INCLUDE) $(LIB_PATH) $(LIB_LIST)
.SUFFIXES: .o .c
.c.o:
$(CC) $(CFLAGS) $(INCLUDE) -c $*.c
clean:
rm -f $(OBJS)
二、编译多个C文件,生成动态链接库
如:test.h test.c abc.c->libabc.so动态链接库
OBJS = test.o abc.o
TARGET = libabc.so
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -G -o $(TARGET) $(OBJS) $(INCLUDE)
.SUFFIXES: .o .c
.c.o:
$(CC) $(CFLAGS) $(INCLUDE) -c $*.c
clean:
rm -f $(OBJS)
三、编译多个EC和C文件,生成可执行文件
如:编译test.h test.ec main.c->main可执行文件
OBJS = test.o main.o
TARGET = main
all: $(TARGET)
$(TARGET): $(OBJS)
$(ESQL) $(CFLAGS) -o $(TARGET) $(OBJS) $(INCLUDE) $(LIB_PATH) $(LIB_LIST)
.SUFFIXES: .ec .c .o
.ec.o:
rm -f $*.c
$(ESQL) $(CFLAGS) $(INCLUDE) -c $*.ec
rm -f $*.c
.c.o:
$(CC) $(CFLAGS) $(INCLUDE) -c $*.c
四、编译多个EC和C文件,生成动态链接库
如:test.h test.ec abc.c->libabc.so动态链接库
CC = cc
ESQL = $(INFORMIXDIR)/bin/esql
CFLAGS = -q64
INCLUDE = -I. \
-I$(INFORMIXDIR)/incl/esql \
-I$(INFORMIXDIR)/incl/public
LIB_PATH = -L$(INFORMIXDIR)/lib \
-L$(INFORMIXDIR)/lib/esql
LIB_LIST = -lbase -ltest -lhaha #(注:这里的动态链接库必须在LD_LIBRARY_PATH的指定路径下,否则会报找不到动态链接库)
OBJS = test.o abc.o
TARGET = libabc.so
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)
$(ESQL) $(CFLAGS) -G -o $(TARGET) $(OBJS) $(LIB_PATH) $(LIB_LIST) $(INCLUDE)
.SUFFIXES: .ec .c .o
.ec.o:
rm -f $*.c
$(ESQL) $(CFLAGS) $(INCLUDE) -c $*.ec
rm -f $*.c
.c.o:
$(CC) $(CFLAGS) $(INCLUDE) -c $*.c
clean:
rm -fr $(OBJS) $(TARGET)
作者:邹祁峰
2013年01月06日