Linux Makefile 静态库动态库应用实例
来源:互联网 发布:linux打开文件数过多 编辑:程序博客网 时间:2024/06/05 19:38
在Linux系统中:
静态库的创建
gcc -c filen.c
ar -cr libname.a file1.o file2.o ...
ar:静态函数库创建的命令
-c :create的意思
-r :replace的意思,表示当前插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误信息,并不替换其他同名的模块。默认的情况下,新的成员增加在库德结尾处。
动态库的创建
gcc -shard -fpic -o libname.so test1.c test2.c ....
-fpic:产生代码位置无关代码
将目录source 文件打包成一个动态库和一个静态库,随后将库文件安装到lib目录,调用的是source 目录下的Makefile
Makefile:
如果直接在shell中使用命令:
动态调用库文件:
gcc main.c -I./include/ -L./lib/ -ltest -o app
在运行可执行文件APP之前,需要指定动态库的位置,否则会出现找不到库文件的错误:
export LD_LIBRARY_PATH='/home/biao/test/Makefile_test/lib/'
如果不指定库的位置,也可以直接将库放到/lib 或者/usr/lib下
静态库文件调用:
gcc -static main.c -I./include/ -L./lib/ -ltest -o app_static
另一种方法:直接添加静态库
gcc main.c -I./include/ ./lib/libtest.a -o app_static
如果同时有静态库和动态库,默认使用的是动态库。
静态库的创建
gcc -c filen.c
ar -cr libname.a file1.o file2.o ...
ar:静态函数库创建的命令
-c :create的意思
-r :replace的意思,表示当前插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误信息,并不替换其他同名的模块。默认的情况下,新的成员增加在库德结尾处。
动态库的创建
gcc -shard -fpic -o libname.so test1.c test2.c ....
-fpic:产生代码位置无关代码
-shared 生成一个共享库
Makefile创建库文件
比较容易懂得方式是:
LIB_NAME?= test STATIC_NAME ?= lib$(LIB_NAME).aSHARE_NAME ?= lib$(LIB_NAME).soall: static_library shared_librarystatic_library: gcc -c *.c; ar -cr $(STATIC_NAME) *.o;shared_library: gcc -shared -fpic -o $(SHARE_NAME) *.c;clean: rm -rf *.o rm -rf *.a *.so
上面的?= 表示如果该变量没有赋值,则进行负责操作。
下面有种比较方便管理但是比较难理解的书写方式:LIB_NAME?= test STATIC_NAME ?= lib$(LIB_NAME).aSHARE_NAME ?= lib$(LIB_NAME).soall:$(STATIC_NAME) $(SHARE_NAME)%.o:%.c $(CC) -c $< -o $@SOURCE := $(wildcard *.c)OBJS := $(patsubst %.c,%.o,$(SOURCE))$(STATIC_NAME):$(OBJS) $(AR) -cr $(STATIC_NAME)$(SHARE_NAME):$(OBJS) gcc -shared -fpic -o $(SHARE_NAME) $(SOURCE)clean: rm -rf $(OBJS) $(STATIC_NAME) $(SHARE_NAME)现在有下面的文件:
.├── include│ ├── test1.h│ ├── test2.h│ └── test3.h├── lib├── main.c├── Makefile└── source ├── Makefile ├── Makefile1 ├── test1.c ├── test2.c └── test3.c └── test3.o文件里面内容与《Makfile 应用进阶实例》中内容一致
将目录source 文件打包成一个动态库和一个静态库,随后将库文件安装到lib目录,调用的是source 目录下的Makefile
Makefile:
LIB_NAME?= test STATIC_NAME ?= lib$(LIB_NAME).aSHARE_NAME ?= lib$(LIB_NAME).soall: static_library shared_librarystatic_library: gcc -c *.c; ar -cr $(STATIC_NAME) *.o;shared_library: gcc -shared -fpic -o $(SHARE_NAME) *.c;install: mv $(STATIC_NAME) ../lib mv $(SHARE_NAME) ../libclean: rm -rf *.o rm -rf $(STATIC_NAME) $(SHARE_NAME)运行结果:
biao@ubuntu:~/test/Makefile_test/source$ biao@ubuntu:~/test/Makefile_test/source$ biao@ubuntu:~/test/Makefile_test/source$ make gcc -c *.c;ar -cr libtest.a *.o;gcc -shared -fpic -o libtest.so *.c;biao@ubuntu:~/test/Makefile_test/source$ make installmv libtest.a ../libmv libtest.so ../libbiao@ubuntu:~/test/Makefile_test/source$ cd ../biao@ubuntu:~/test/Makefile_test$ tree.├── include│ ├── test1.h│ ├── test2.h│ └── test3.h├── lib│ ├── libtest.a│ └── libtest.so├── main.c├── Makefile└── source ├── Makefile ├── Makefile1 ├── test1.c ├── test1.o ├── test2.c ├── test2.o ├── test3.c └── test3.o3 directories, 15 filesbiao@ubuntu:~/test/Makefile_test$
如果直接在shell中使用命令:
动态调用库文件:
gcc main.c -I./include/ -L./lib/ -ltest -o app
在运行可执行文件APP之前,需要指定动态库的位置,否则会出现找不到库文件的错误:
export LD_LIBRARY_PATH='/home/biao/test/Makefile_test/lib/'
如果不指定库的位置,也可以直接将库放到/lib 或者/usr/lib下
静态库文件调用:
gcc -static main.c -I./include/ -L./lib/ -ltest -o app_static
另一种方法:直接添加静态库
gcc main.c -I./include/ ./lib/libtest.a -o app_static
如果同时有静态库和动态库,默认使用的是动态库。
在Makefile中链接库文件:
EXE?= test SHARE_EXE ?= share_$(EXE)STATIC_EXE ?= static_$(EXE)INCL := -I./include/LIB := -L./lib/LIB_NAME := testFLAG := -staticall: static_app shared_appstatic_app: $(CC) $(FLAG) main.c $(INCL) $(LIB) -l$(LIB_NAME) -o $(STATIC_EXE)shared_app: $(CC) main.c $(INCL) $(LIB) -l$(LIB_NAME) -o $(SHARE_EXE)clean: rm -rf $(STATIC_EXE) $(SHARE_EXE)这里同时生产两个可执行文件:share_test 和 static_test
执行结果如下:
biao@ubuntu:~/test/Makefile_test$ biao@ubuntu:~/test/Makefile_test$ lsinclude lib main.c Makefile sourcebiao@ubuntu:~/test/Makefile_test$ makecc -static main.c -I./include/ -L./lib/ -ltest -o static_testcc main.c -I./include/ -L./lib/ -ltest -o share_testbiao@ubuntu:~/test/Makefile_test$ lsinclude lib main.c Makefile share_test source static_testbiao@ubuntu:~/test/Makefile_test$ ./share_test I am test1 !I am test2 !I am test3 !biao@ubuntu:~/test/Makefile_test$ ./static_test I am test1 !I am test2 !I am test3 !biao@ubuntu:~/test/Makefile_test$ biao@ubuntu:~/test/Makefile_test$
测试代码可以到这里下载: Linux Makefile 静态库动态库应用实例
0 0
- Linux Makefile 静态库动态库应用实例
- Linux 静态库动态库 Makefile 制作
- linux 静态库,makefile
- makefile静态库 动态库
- linux编译动态库和静态库的makefile示例
- linux下静态库、动态库编译及makefile书写
- linux编译动态库和静态库的makefile示例
- Linux 动态和静态库(.so & .a)的Makefile模板
- linux下静动态库Makefile的编写和应用
- makefile与静态库的几个实例
- makefile与静态库的几个实例
- makefile编译静态库和动态库
- makefile编译静态库和动态库
- 静态库动态库和makefile
- makefile跨平台,动态库,静态库
- linux下动态库与静态库实例
- Linux静态库与动态库生成与调用实例
- Linux静态和动态链接库使用实例
- JavaScript获取对象中元素个数
- 24位FPD-LINK II发送器 转接IC GM8905:TTL转LVDS芯片
- 设计模式--23种模式精华(四)
- openfire插件开发-聊天记录插件
- Java简洁代码-几点原则
- Linux Makefile 静态库动态库应用实例
- mysql事务处理用法与实例详解
- Android数据库框架greenDao学习笔记 2
- Android通过反射方式强制退出应用程序
- arcgis error 000224 000372
- 二进制的运算相关
- [UVA]10474 Where is the Marble?
- 【seo优化】为什么说网站被劫持了?
- java中操作数据库中的几个重要类