linux 动态库的创建和使用

简介

动态库相比动态库有以下优点:

  1. 由于不用静态连接到使用库的每个程序中,使用动态库更节省内存;
  2. 升级方便,升级动态库,可以不用重新编译使用库的程序;

注意:在x86架构下,使用动态库可能降低性能。

创建和使用共享库

我们使用上一篇《Linux 静态库的创建和使用》中的程序清单,只不过这次我们不生成静态库,而是生成动态库。同时为了方便我们使用Makefile文件。

Makefile内容如下:

[plain]  view plain copy print ?
  1. CFLAGS=-Wall -L.  
  2. LIBCFLAGS= $(CFLAGS) -fPIC  
  3. CC=g++  
  4. OBJS=main.o  
  5. LIBOBJS=say_hello.o say_world.o  
  6. AR=ar rc  
  7. LIBRARY=libhelloworld.so.1.0.0  
  8. SONAME=libhelloworld.so.1  
  9.   
  10. all:main  
  11.   
  12. main:$(OBJS) $(LIBRARY)  
  13.         $(CC) $(CFLAGS) -o $@ $(OBJS) -lhelloworld  
  14.   
  15. $(LIBRARY):$(LIBOBJS)  
  16.         $(CC) -shared -Wl,-soname,$(SONAME) -o $@ $(LIBOBJS)   
  17.         ln -sf $@ libhelloworld.so  
  18.         ln -sf $@ $(SONAME)  
  19.   
  20. main.o:main.cpp  
  21.         $(CC) $(CFLAGS) -c -o $@ $<  
  22.   
  23. %.o:%.cpp  
  24.         $(CC) $(LIBCFLAGS) -c -o $@ $<  
  25.   
  26. clean:  
  27.         rm -rf $(OBJS) $(LIBRARY) $(LIBOBJS) libhelloworld.so* main  

使用make命令编译程序

  1. [wayz11@linux]$ make  
  2. g++ -Wall -L. -c -o main.o main.cpp  
  3. g++ -Wall -L. -fPIC -c -o say_hello.o say_hello.cpp  
  4. g++ -Wall -L. -fPIC -c -o say_world.o say_world.cpp  
  5. g++ -shared -Wl,-soname,libhelloworld.so.1 -o libhelloworld.so.1.0.0 say_hello.o say_world.o   
  6. ln -sf libhelloworld.so.1.0.0 libhelloworld.so  
  7. ln -sf libhelloworld.so.1.0.0 libhelloworld.so.1  
  8. g++ -Wall -L. -o main main.o -lhelloworld  

我们解释一下上面的过程:

第一行生成main.o目标文件;

第二、三行中的-fPIC选项产生位置无关代码。由于动态库是在运行的时候被调入,在编译时,装入内存的地址还不知道,因此这个选项是必须的。这两行生成用于生成库的目标文件:say_hello.o和say_world.o。

第四行,-shared选项告诉编译器生成动态库。-Wl选项使得后面的选项-soname libhelloworld.so.1被传递给连接器。

第五、六行创建了两个软连接。

第七行生成可执行文件。

使用库

要想在程序正常运行,我们还需要告诉系统如何(或在哪)加载我们的共享库。

有如下两个方法:

  • libhelloworld.so拷贝到/etc/ld.so.conf中列举的任何目录,并以root身份运行ldconfig;或者
  • 在库所在目录,运行export LD_LIBRARY_PATH=`pwd`命令,把库所在目录加到共享库搜索路径中去。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值