工程中编写自己的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
不知道在大型的工程中使用动态库文件比不使用库文件会不会小些??
相关文章推荐
- 工程中编写自己的makefile---2 实例
- 工程中编写自己的makefile---4 库文件
- cmake使用总结(二)---工程目录下子目录CMakeLists文件编写
- Eclipse中使用自己的makefile管理工程
- Linux/Unix下makefile文件编写实例
- cmake使用总结(二)---工程目录下子目录CMakeLists文件编写
- makefile文件的编写规则及实例 (转)
- 使用定义文件和WINAPI宏编写自己的API动态库
- 自己编写的久经考验的文件上传类,可以直接使用
- php学习之道:php中soap的使用实例以及生成WSDL文件,提供自己主动生成WSDL文件的类库——SoapDiscovery.class.php类
- 编写自己的makefile文件
- cmake使用总结(一)---工程主目录CMakeList文件编写
- 编写多文件,多目录makefile(借鉴网上的一篇文章来自己练手)
- Linux下gSOAP的安装及使用<测试>及MakeFile 文件的编写
- cmake使用总结(一)---工程主目录CMakeList文件编写
- RTEMS 应用程序含有多级子目录的Makefile工程文件编写
- cmake使用总结(转)---工程主目录CMakeList文件编写
- Eclipse中使用自己的makefile管理工程
- Eclipse中使用自己的makefile管理工程
- 使用定义文件和WINAPI宏编写自己的API动态库