设为首页 加入收藏

TOP

Linux 动态库的创建和使用
2014-11-24 08:05:35 来源: 作者: 【 】 浏览:1
Tags:Linux 动态 建和 使用

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


由于不用静态连接到使用库的每个程序中,使用动态库更节省内存;
升级方便,升级动态库,可以不用重新编译使用库的程序;
注意:在x86架构下,使用动态库可能降低性能。


Makefile内容如下:


CFLAGS=-Wall -L.
LIBCFLAGS= $(CFLAGS) -fPIC
CC=g++
OBJS=main.o
LIBOBJS=say_hello.o say_world.o
AR=ar rc
LIBRARY=libhelloworld.so.1.0.0
SONAME=libhelloworld.so.1


all:main


main:$(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]$ make
g++ -Wall -L. -c -o main.o main.cpp
g++ -Wall -L. -fPIC -c -o say_hello.o say_hello.cpp
g++ -Wall -L. -fPIC -c -o say_world.o say_world.cpp
g++ -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.so
ln -sf libhelloworld.so.1.0.0 libhelloworld.so.1
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`命令,把库所在目录加到共享库搜索路径中去。



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android ListView 的下拉刷新【附.. 下一篇Adroid 4.0 HttpURLConnection抛..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·TCP/UDP协议_百度百科 (2025-12-26 12:20:11)
·什么是TCP和UDP协议 (2025-12-26 12:20:09)
·TCP和UDP详解 (非常 (2025-12-26 12:20:06)
·Python 教程 - W3Sch (2025-12-26 12:00:51)
·Python基础教程,Pyt (2025-12-26 12:00:48)