您的位置:首页 > 其它

工程中编写自己的makefile---5 在实例2中使用库文件

2017-06-05 16:29 525 查看

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
不知道在大型的工程中使用动态库文件比不使用库文件会不会小些??
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: