关于共享库so的制作问题

C、C++和Java语言
回复
头像
ttand
帖子: 1743
注册时间: 2005-08-22 14:05
来自: 离开北京
送出感谢: 1 次
接收感谢: 3 次

关于共享库so的制作问题

#1

帖子 ttand » 2010-11-24 11:57

我做过一些关于linux共享库的东西。但是做的感觉慢粗糙的。

我的共享库都是直接由 .o文件 gcc -shared。所有的链接符号都在so文件中,可以用nm xxx.so 直接看到里面有些什么函数的。

好像有说这种链接方式不大好,特别是性能比较差。。。

推荐so中没有符号,所有链接所需要符号都做到一个.a的静态库中。编译链接可执行文件过程不需要so文件参与。

只在程序运行时有静态库中代码载入共享库相应地址执行。

看了下 /usr/lib 下面的库文件,大部分需要性能的库都作成了这种方式。比如libm.so等。

这种库要怎么做呢?求点化
错过好多好贴,没占到广告位后悔啊
头像
ly50247
帖子: 89
注册时间: 2008-07-29 8:01
送出感谢: 0
接收感谢: 0

Re: 关于共享库so的制作问题

#2

帖子 ly50247 » 2010-12-07 23:14

头像
ttand
帖子: 1743
注册时间: 2005-08-22 14:05
来自: 离开北京
送出感谢: 1 次
接收感谢: 3 次

Re: 关于共享库so的制作问题

#3

帖子 ttand » 2010-12-08 17:06

你吧so里面的符号给strip之后没有.a文件就没法链接了。
能知道怎么作那个.a文件吗?


windows 下面也有同样的东西。用def导出函数就会导致dll中有符号
如果在函数申明是用dllexport 就会有一个静态库引出它的函数符号

关键是知道两种方式的不同阿。

如果用-share 生成的东东在strip一下。先前链接过的可执行文件还能执行吗?
错过好多好贴,没占到广告位后悔啊
头像
ly50247
帖子: 89
注册时间: 2008-07-29 8:01
送出感谢: 0
接收感谢: 0

Re: 关于共享库so的制作问题

#4

帖子 ly50247 » 2010-12-08 17:59

ttand 写了:
你吧so里面的符号给strip之后没有.a文件就没法链接了。
能知道怎么作那个.a文件吗?


windows 下面也有同样的东西。用def导出函数就会导致dll中有符号
如果在函数申明是用dllexport 就会有一个静态库引出它的函数符号

关键是知道两种方式的不同阿。

如果用-share 生成的东东在strip一下。先前链接过的可执行文件还能执行吗?
你完全可以自己试试:

test.cpp:

#include <iostream>

using namespace std;

int fun()
{
cout << "good";


return 0;
}


c++.cpp

#include <iostream>

using namespace std;

int fun();
int main()
{
fun();



return 0;
}


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

strip libtest.so

g++ c++.cpp -ltest -L`pwd`

sudo cp libtest.so /usr/lib/libtest.so

./a.out

完全正常。
在linux下.so是不需要.a。
头像
ttand
帖子: 1743
注册时间: 2005-08-22 14:05
来自: 离开北京
送出感谢: 1 次
接收感谢: 3 次

Re: 关于共享库so的制作问题

#5

帖子 ttand » 2010-12-09 10:39

的确如此,

感谢楼上的C++控了

纯c也一样,我试过了
错过好多好贴,没占到广告位后悔啊
回复

回到 “C/C++/Java”