Linux Makefile 静态库动态库应用实例

在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 静态库动态库应用实例


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li_wen01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值