静态库与动态链接库

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路径写入(这样添加到so搜索路径之中),并sudo ldconfig,这个方法最稳妥

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

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

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

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

一个例子:

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

若使用dlopen打开so失败,最直接的方法是打印 dlerror() 查看报告信息

if((handle = dlopen(myso, RTLD_NOW | RTLD_GLOBAL)) == NULL) {  
    printf("dlopen - %s\n", dlerror());  
    exit(-1);
}

m_create = (create_func)dlsym(handle, "create");
if(!m_create) {
    printf("dlsym - %s\n", dlerror());
    exit(-1);
}

dlclose(handle);

ldd -r xxx.so可以查看这个so使用了哪些lib(so)以及是否找到

若出现undefined symbol: xxxx,则说明这个so中有未解决的符号引用(可能没有找到函数的实现)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值