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

来源:互联网 发布:可以用淘宝贷的口子 编辑:程序博客网 时间:2024/05/22 02:17

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

不知道在大型的工程中使用动态库文件比不使用库文件会不会小些??

阅读全文
0 0
原创粉丝点击