在Linux系统中:
静态库的创建
gcc -c filen.c
ar -cr libname.a file1.o file2.o …
ar:静态函数库创建的命令
-c :create的意思
-r :replace的意思,表示当前插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误信息,并不替换其他同名的模块。默认的情况下,新的成员增加在库德结尾处。
动态库的创建
gcc -shared -fpic -o libname.so test1.c test2.c ….
-fpic:产生代码位置无关代码
-shared 生成一个共享库
Makefile创建库文件
比较容易懂得方式是:
LIB_NAME?= test
STATIC_NAME ?= lib$(LIB_NAME).a
SHARE_NAME ?= lib$(LIB_NAME).so
all: static_library shared_library
static_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).a
SHARE_NAME ?= lib$(LIB_NAME).so
all:$(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).a
SHARE_NAME ?= lib$(LIB_NAME).so
all: static_library shared_library
static_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) ../lib
clean:
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 install
mv libtest.a ../lib
mv libtest.so ../lib
biao@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.o
3 directories, 15 files
biao@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 := test
FLAG := -static
all: static_app shared_app
static_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$ ls
include lib main.c Makefile source
biao@ubuntu:~/test/Makefile_test$ make
cc -static main.c -I./include/ -L./lib/ -ltest -o static_test
cc main.c -I./include/ -L./lib/ -ltest -o share_test
biao@ubuntu:~/test/Makefile_test$ ls
include lib main.c Makefile share_test source static_test
biao@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 静态库动态库应用实例
今天的文章Linux Makefile 静态库动态库应用实例分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/12398.html