1 在2章节中使用库文件
1.1 使用静态库文件
1.1.1 add目录子makefile
#$(shell ls -d */) 命令打印当前目录下的所有文件夹
DIRS := $(shell ls -d */) ./
OBJSDIR := ../objs
LIBNAME := libadd
LIBXX := a
FILES := $(foreach dirs, $(DIRS), $(wildcard $(dirs)*.c))
OBJS := $(patsubst %.c, %.o, $(FILES))
CFLAGS := -O2
CC := gcc
RM := rm -f
all:$(OBJS) $(OBJSDIR)
$(OBJS):%.o:%.c
$(CC) -c $< -o $@$(CFLAGS)
#依赖一个伪目标,这样每次编译时因为ALWAYSMAKE不存在,都会执行命令
$(OBJSDIR):ALWAYSMAKE
cp $(OBJS) $(OBJSDIR)
# $(CC) -fPIC -shared -o$(LIBNAME).$(LIBXX) $(OBJS)
ar rc$(LIBNAME).$(LIBXX) $(OBJS)
cp $(LIBNAME).$(LIBXX)$(OBJSDIR)
.PHONY:clean
clean:
$(RM) $(OBJS)*.$(LIBXX)
.PHONY:ALWAYSMAKE
ALWAYSMAKE:
1.1.2 sub目录子makefile
#$(shell ls -d */) 命令打印当前目录下的所有文件夹
DIRS := $(shell ls -d */) ./
OBJSDIR := ../objs
LIBNAME := libsub
LIBXX := a
FILES := $(foreach dirs, $(DIRS), $(wildcard $(dirs)*.c))
OBJS := $(patsubst %.c, %.o, $(FILES))
CFLAGS := -O2
CC := gcc
RM := rm -f
all:$(OBJS) $(OBJSDIR)
$(OBJS):%.o:%.c
$(CC) -c $< -o $@$(CFLAGS)
#依赖一个伪目标,这样每次编译时因为ALWAYSMAKE不存在,都会执行命令
$(OBJSDIR):ALWAYSMAKE
cp $(OBJS) $(OBJSDIR)
# $(CC) -fPIC -shared -o$(LIBNAME).$(LIBXX) $(OBJS)
ar rc$(LIBNAME).$(LIBXX) $(OBJS)
cp $(LIBNAME).$(LIBXX)$(OBJSDIR)
.PHONY:clean
clean:
$(RM) $(OBJS)*.$(LIBXX)
.PHONY:ALWAYSMAKE
ALWAYSMAKE:
1.1.3 主makefile
export WORKDIR := $(shell pwd)
OBJSDIR := $(WORKDIR)/objs
export CC := gcc
export CFLAGS := -Iadd -Isub -O2
export LIBS := -lsub -ladd
export MPPLIBS := -L./objs
RM := rm -f
TARGET := xxxx
OBJS := main.o
$(TARGET):$(OBJS) $(OBJSDIR) ALWAYSMAKE
$(MAKE) -C add
$(MAKE) -C sub
$(CC) -o $(TARGET)$(OBJS) $(MPPLIBS) $(LIBS) $(CFLAGS) -static
# $(CC) -o $(TARGET)$(OBJS) $(MPPLIBS) $(CFLAGS) -Wl,-Bstatic -ladd -Wl,-Bdynamic -lsub-Wl,-Bdynamic
$(OBJSDIR):ALWAYSMAKE
cp $(OBJS) $(OBJSDIR)
.PHONY:clean
clean:
$(MAKE) clean -C add
$(MAKE) clean -C sub
$(RM) $(OBJS) $(TARGET)$(OBJSDIR)/*.o $(OBJSDIR)/*.a $(OBJSDIR)/*.so
.PHONY:ALWAYSMAKE
ALWAYSMAKE:
1.2 使用动态库文件
1.2.1 add目录子makefile
#$(shell ls -d */) 命令打印当前目录下的所有文件夹
DIRS := $(shell ls -d */) ./
OBJSDIR := ../objs
LIBNAME := libadd
LIBXX := so
FILES := $(foreach dirs, $(DIRS), $(wildcard $(dirs)*.c))
OBJS := $(patsubst %.c, %.o, $(FILES))
CFLAGS := -O2
CC := gcc
RM := rm -f
all:$(OBJS) $(OBJSDIR)
$(OBJS):%.o:%.c
$(CC) -c $< -o $@$(CFLAGS)
#依赖一个伪目标,这样每次编译时因为ALWAYSMAKE不存在,都会执行命令
$(OBJSDIR):ALWAYSMAKE
cp $(OBJS) $(OBJSDIR)
$(CC) -fPIC -shared -o$(LIBNAME).$(LIBXX) $(OBJS)
# ar rc$(LIBNAME).$(LIBXX) $(OBJS)
cp $(LIBNAME).$(LIBXX)$(OBJSDIR)
.PHONY:clean
clean:
$(RM) $(OBJS)*.$(LIBXX)
.PHONY:ALWAYSMAKE
ALWAYSMAKE:
1.2.2 sub目录子makefile
#$(shell ls -d */) 命令打印当前目录下的所有文件夹
DIRS := $(shell ls -d */) ./
OBJSDIR := ../objs
LIBNAME := libsub
LIBXX := so
FILES := $(foreach dirs, $(DIRS), $(wildcard $(dirs)*.c))
OBJS := $(patsubst %.c, %.o, $(FILES))
CFLAGS := -O2
CC := gcc
RM := rm -f
all:$(OBJS) $(OBJSDIR)
$(OBJS):%.o:%.c
$(CC) -c $< -o $@$(CFLAGS)
#依赖一个伪目标,这样每次编译时因为ALWAYSMAKE不存在,都会执行命令
$(OBJSDIR):ALWAYSMAKE
cp $(OBJS) $(OBJSDIR)
$(CC) -fPIC -shared -o$(LIBNAME).$(LIBXX) $(OBJS)
# ar rc$(LIBNAME).$(LIBXX) $(OBJS)
cp $(LIBNAME).$(LIBXX)$(OBJSDIR)
.PHONY:clean
clean:
$(RM) $(OBJS)*.$(LIBXX)
.PHONY:ALWAYSMAKE
ALWAYSMAKE:
1.2.3 主makefile
export WORKDIR := $(shell pwd)
OBJSDIR := $(WORKDIR)/objs
export CC := gcc
export CFLAGS := -Iadd -Isub -O2
export LIBS := -lsub -ladd
export MPPLIBS := -L./objs
RM := rm -f
TARGET := xxxx
OBJS := main.o
$(TARGET):$(OBJS) $(OBJSDIR) ALWAYSMAKE
$(MAKE) -C add
$(MAKE) -C sub
$(CC) -o $(TARGET)$(OBJS) $(MPPLIBS) $(LIBS) $(CFLAGS)
# $(CC) -o $(TARGET)$(OBJS) $(MPPLIBS) $(CFLAGS) -Wl,-Bstatic -ladd -Wl,-Bdynamic -lsub-Wl,-Bdynamic
$(OBJSDIR):ALWAYSMAKE
cp $(OBJS) $(OBJSDIR)
.PHONY:clean
clean:
$(MAKE) clean -C add
$(MAKE) clean -C sub
$(RM) $(OBJS) $(TARGET)$(OBJSDIR)/*.o $(OBJSDIR)/*.a $(OBJSDIR)/*.so
.PHONY:ALWAYSMAKE
ALWAYSMAKE:
1.2.4 运行
如果直接运行,会出现如下错误
[root@9527 5]# ./xxxx
./xxxx: error whileloading shared libraries: libsub.so: cannot open shared object file: No suchfile or directory
打印变量LD_LIBRARY_PATH,为空
[root@9527 5]# echo$LD_LIBRARY_PATH
我们需要添加动态库.so文件的目录,一直我们的库文件存放在/xxx/study/5/objs
执行如下命令
exportLD_LIBRARY_PATH="/xxx/study/5/objs:$LD_LIBRARY_PATH"
再次运行
[root@9527 5]# ./xxxx
float x-y IS:0.000000
int a+b IS:22
int a-b IS:-2
float x+y IS:11.110000
float x-y IS:0.000000
float x-y IS:-8.642000
1.2.5 总结
不使用库文件编译得到可执行文件大小5616
使用动态库文件编译得到可执行文件大小5712
使用静态库文件编译得到可执行文件大小623890
不知道在大型的工程中使用动态库文件比不使用库文件会不会小些??