今天遇到一个麻烦,就是如何打包静态库文件到另一个静态库文件中。围观了一下ar文档以及网上blog,得到如下解决方案,直接给上例子代码,研读一会儿就能知道原理了。
sum.c
例子:
main.c(打印数字的和与差。和函数在一个sum.o(gcc -c sum.c得到)文件中,差函数在libsub.a(gcc -c sub.c||ar -r libsub.a sub.c得到)库中)。
#include<stdio.h>
extern int sum(int i,int j);
extern int sub(int i,int j);
int global = 0;
int main(){
int i=4;
int j=3;
printf("sum:%d\n",sum(i,j));
printf("sub:%d\n",sub(i,j));
printf("global:%d\n",global);
return 0;
}
int sub(int i,int j){
return (i-j);
}
sum.c
#include "global.h"
int sum(int i,int j){
global = 4;
return (i+j);
}
global.h
extern int global;
CC = gcc
AR = ar
RM = rm
CP = cp
ECHO = echo
INCLUDES = -I./
CFLAGS += -O2 $(INCLUDES)
include tool.mak
TARGET = libyuerapi.a
LIBS = libsub.a
OBJS = sum.o
all:$(TARGET)
$(TARGET):$(OBJS) $(LIBS)
$(BUILD_LIBRARY)
%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@
clean:
$(RM) *.o $(TARGET)
too.mak
define BUILD_LIBRARY
$(if $(wildcard $@),@$(RM) $@)
$(if $(wildcard ar.mac),@$(RM) ar.mac)
$(if $(filter lib%.a, $^),
@$(ECHO) CREATE $@ > ar.mac
@$(ECHO) SAVE >> ar.mac
@$(ECHO) END >> ar.mac
@$(AR) -M < ar.mac)
$(if $(filter %.o,$^),@$(AR) -q $@ $(filter %.o, $^))
$(if $(filter %.a, $^),
@$(ECHO) OPEN $@ > ar.mac
$(foreach LIB, $(filter lib%.a, $^),
@echo ADDLIB $(LIB) >> ar.mac)
@$(ECHO) SAVE >> ar.mac
@$(ECHO) END >> ar.mac
@$(AR) -M < ar.mac)
endef