工程中編寫自己的makefile---5 在實例2中使用庫文件

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

不知道在大型的工程中使用動態庫文件比不使用庫文件會不會小些??

發佈了51 篇原創文章 · 獲贊 106 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章