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
(.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
19CFLAGS=-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