| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 379 人关注过本帖
标题:c++中如何应用.so共享库
只看楼主 加入收藏
shitainong
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2012-7-6
结帖率:0
收藏
 问题点数:0 回复次数:1 
c++中如何应用.so共享库
什么是。so文件呢?so是unix的动态连接库,是二进制文件,作用相当于windows下的。dll文件,这一说大家大概就明白了,其实。so就是在我们在运行时动态调用的一个库文件,为什么我们要使用。so呢,其实是这样我们有时候在编程的过程中,遇到一类问题的解决需要我们抽象出共有的对象在c++中我们称之为基类,但是具体的实现需要有他的子类来完成,这样的情况下一般假如后续要修改程序的话我们只要修改子类的内容,基类是不会修改的,这样我们可以把子类的实现封装在一个。so文件中,在运行时动态加载它。修改时也只需要修改这个子类文件重新编译成。so即可。这样就大大增加了程序的可移植性,是一个良好的编程习惯!

说了这么多,到底怎么来使用。so文件呢,下面我来举一个很简单的例子!这里用到了三个文件。www.

test.h:

#inlude<iostream>

using namespace std;

void hello();

test.cpp

#include"test.h"

void hello()

{

cout《"hello world"《endl;

}

hello.cpp

#include"test.h"

int main()

{

hello();

return 0;

}

我们这里将test.cpp打包成。so文件:

g++ test.cpp -shared -o libtest.so

在编译hello.cpp的时候动态的加载它:

g++ hello.cpp -L. -ltest -o hello

我们可以通过ldd的命令看看是否加载了该动态库libtest.so;

ldd hello

linux-gate.so.1 => (0xb7771000)

libtest.so => /usr/lib/libtest.so (0xb7759000)

libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb766e000)

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74ef000)

libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb74c5000)

/lib/ld-linux.so.2 (0xb7772000)

libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb74a7000)

这样我们发现已经加载了该库文件;

./hello

就能得到我们执行的结果了!

加载过程中遇到的问题:

肯能会出现库找不到的情况,因为系统在执行命令的时候/usr/lib中找我们的库文件,我只需加一个软链接就行了;

sudo ln -s ~/libtest.so /usr/lib/test.so

这样就能够正确执行了!!!www.
搜索更多相关主题的帖子: 二进制 如何 动态 
2012-07-25 17:18
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
普及 unix 文化,顶一顶。
不过感觉楼主还是没说清楚动态加载有什么优势呀,难道只是体现在移植性上吗?如果说是只需修改子类文件,不用重新编译整个项目,那么最常规的用 make 控制也不是重新编译整个项目呀。
另外这套技术还是用在 c 语言的项目上多一些。因为 C++ 里大多都是模版类,在使用的时候编译才能确定类型,所以库普遍不能提前编译成可执行代码。
2012-07-26 00:40
快速回复:c++中如何应用.so共享库
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017604 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved