工程中编写自己的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
不知道在大型的工程中使用动态库文件比不使用库文件会不会小些??
- 工程中编写自己的makefile---5 在实例2中使用库文件
- 工程中编写自己的makefile---2 实例
- 工程中编写自己的makefile---4 库文件
- 工程中编写自己的makefile---6 makefile学习
- 工程中编写自己的Makefile---1 一些基本概念
- 工程中编写自己的makefile---3 交叉编译工具
- 工程中编写自己的makefile---7 shell学习
- 工程中编写自己的makefile---8 编写Arm开发板的makefile
- 通用Makefile的编写和在项目工程中使用Makefile(包括动态库、静态库的链接、整个工程联合编译)
- Eclipse中使用自己的makefile管理工程
- Eclipse中使用自己的makefile管理工程
- Eclipse中使用自己的makefile管理工程
- Eclipse中使用自己的makefile管理工程
- Eclipse中使用自己的makefile管理工程
- Eclipse中使用自己的makefile darknet管理工程
- 自己编写的一个库文件,还在不断丰富中,欢迎使用
- 编写自己的makefile文件
- 怎么在xcode工程中创建自己的plist文件
- redis3.2.9 编译安装
- 如何使用OpenCV的处理图像,文字变得锐利和清晰?(How to use OpenCV to process image so that the text become sharp and clea
- linux之sed用法
- 向MATLAB2015a导入Excel文件时出现“could not open the spreadsheet”错误提示(已解决)
- [C++11]std::packaged_task介绍及使用
- 工程中编写自己的makefile---5 在实例2中使用库文件
- Spring@Autowired注解与省去get和set方法,对注解Autowired放在setter方法上的情况
- Android Inflate 的使用
- ffmpeg截图
- 【前端插件】表单验证(结果绑定按钮可用状态)
- JAVA遇见HTML——Servlet(1)
- CNN中各层图像大小的计算
- Oracle:表名、字段名、constraint名的长度有限制
- Android USB Host与HID通讯