linux 动态库的创建和使用
来源:互联网 发布:龙卷风vpn下载软件 编辑:程序博客网 时间:2024/05/20 16:33
简介
动态库相比动态库有以下优点:
- 由于不用静态连接到使用库的每个程序中,使用动态库更节省内存;
- 升级方便,升级动态库,可以不用重新编译使用库的程序;
注意:在x86架构下,使用动态库可能降低性能。
创建和使用共享库
我们使用上一篇《Linux 静态库的创建和使用》中的程序清单,只不过这次我们不生成静态库,而是生成动态库。同时为了方便我们使用Makefile文件。
Makefile内容如下:
CFLAGS=-Wall -L.LIBCFLAGS= $(CFLAGS) -fPICCC=g++OBJS=main.oLIBOBJS=say_hello.o say_world.oAR=ar rcLIBRARY=libhelloworld.so.1.0.0SONAME=libhelloworld.so.1all:mainmain:$(OBJS) $(LIBRARY) $(CC) $(CFLAGS) -o $@ $(OBJS) -lhelloworld$(LIBRARY):$(LIBOBJS) $(CC) -shared -Wl,-soname,$(SONAME) -o $@ $(LIBOBJS) ln -sf $@ libhelloworld.so ln -sf $@ $(SONAME)main.o:main.cpp $(CC) $(CFLAGS) -c -o $@ $<%.o:%.cpp $(CC) $(LIBCFLAGS) -c -o $@ $<clean: rm -rf $(OBJS) $(LIBRARY) $(LIBOBJS) libhelloworld.so* main
使用make命令编译程序
[wayz11@linux]$ makeg++ -Wall -L. -c -o main.o main.cppg++ -Wall -L. -fPIC -c -o say_hello.o say_hello.cppg++ -Wall -L. -fPIC -c -o say_world.o say_world.cppg++ -shared -Wl,-soname,libhelloworld.so.1 -o libhelloworld.so.1.0.0 say_hello.o say_world.o ln -sf libhelloworld.so.1.0.0 libhelloworld.soln -sf libhelloworld.so.1.0.0 libhelloworld.so.1g++ -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`命令,把库所在目录加到共享库搜索路径中去。
- linux 动态库的创建和使用
- Linux动态库的创建和使用
- linux 动态库的创建和使用
- linux 动态链接库的创建和使用--动态连接
- linux 动态链接库的创建和使用--动态连接
- Windows和Linux下动态库的创建和使用
- linux 动态链接的创建和使用
- linux的动态链接库的创建和使用
- Linux静态库和动态库的创建与使用
- Linux下静态库、动态库的创建和使用
- Linux库的创建和使用--动态库
- Linux下静态库、动态库的创建和使用
- Linux静态/动态链接库的创建和使用
- Linux静态/动态链接库的创建和使用
- Linux静态/动态链接库的创建和使用
- Linux静态/动态链接库的创建和使用
- Linux静态/动态链接库的创建和使用
- Linux静态/动态链接库的创建和使用
- strip: Unable to recognise the format of the input file
- 修旱冰场
- android拦截短信并屏蔽系统的Notification
- 1012. The Best Rank
- 程序员要找到自己的兴趣所在
- linux 动态库的创建和使用
- file的getPath getAbsolutePath和getCanonicalPath的不同
- OpenStack keystone的理解
- 第三周 项目4-长方柱类
- 递归函数
- JS的Document属性和方法
- JavaScript可否多线程? 深入理解JavaScript定时机制(转)
- 服务器TPMC值计算
- Paste.deploy学习