ddddfang's Blog.

static-dynamic-library

字数统计: 541阅读时长: 2 min
2019/01/28 Share

1.linux下.a与.so文件:

  • .a文件是静态链接库,一般生成的时候所需的所有依赖都在其中(所以.a文件通常比较大),使用.a文件的binary会将其当作普通.o文件一样完全拷贝至binary(link也可),运行时不需要.a文件在场
  • .so文件是共享链接库,一般生成的时候只包括本project,不会将依赖的库拷贝(即大多也是使用的.so,所以.so文件通常比较小),使用.so的binary可以在compile时候(只是检查一下并记录函数位置)或者运行时将.so加载,运行时需要.so文件在场

2.别人提供了.a/.so文件,如何使用?

(.so)makefile,link时,-L -l -l,编译.c到.o时指定 xx.h(可参考makefile典例)
(.so)或者直接在代码中使用dlopen(),dlsym(),dlclose()的方式(-L 方式就相当于运行过程中.so一直处于dlopen状态)
(.a)直接将.a文件当作已经完成编译的、现成的.o文件参与编译即可(OBJS 加上.a)

当一个项目使用到.so动态库,除了需要在工程中制定库的include目录和库的路径+名字,使工程可以编译通过外,还需要运行时告知so路径:

  • 一般从terminal运行的app,可以直接在.bashrc中添加 PATH, LD_LIBRARY_PATH
  • 若是希望所有的ap均可以使用(非terminal启动的,比如qtcreator),就需要在 /etc/ld.so.conf.d/下创建xxx.conf文件,将lib路径写入,并sudo ldconfig,这个方法最稳妥(一个demo是ffmpeg学习–>ffmpeg在linux下编译与使用2)

查看.so里面都包含了些什么接口:

# arm-none-linux-gnueabi-readelf -s libtvad.so
# readelf-s libtvad.so 

3.如何制作.so/.a?

生成.so只需要在链接的时候加上标志(参考06 makefile1): LDFLAGS += –shared -fPIC
生成.a 需要使用ar命令: ${CROSS}ar -r -o x.a

一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CFLAGS=-g -Wall -Werror

ifdef ARCH
LDFLAGS+=-arch ${ARCH}
CFLAGS+=-arch ${ARCH}
endif

all: huffcode libhuffman.a

huffcode: huffcode.o libhuffman.a
$(CC) $(LDFLAGS) -o $@ huffcode.o libhuffman.a

huffman.o: huffman.h

libhuffman.a: huffman.o
$(AR) r $@ $<

clean:
$(RM) *.o *~ core huffcode huffcode.exe libhuffman.a

CATALOG
  1. 1. 1.linux下.a与.so文件:
  2. 2. 2.别人提供了.a/.so文件,如何使用?
  3. 3. 3.如何制作.so/.a?