Linux下创建和调用动态链接库(.so)相关问题。高手进!

friday5pm 2007-04-23 03:45:15
简单开始提问:
1.生成.so时候 -fpic 的作用和必要性?我加上和去掉在隐式调用下没有区别
2. z=(double (*)(double,double))dlsym((char *)dp,"pow"); //pow函数
可以调用成功。
这个和网上到处搜索到的
pStrlenFun = dlsym(pdlHandle, "Strlen");
是不一样的。
网上的这样调用会出错。为什么都还这么写?是不是编译器,平台之类不同???
3.
double GetTest(double asin)
{
return asin/2;
}
这样编译生成的.so可以隐式调用成功,但是显示调用不行,可以dlopen,但是dlsym error:undefined symbol: GetTest
这是什么原因?
但是调用系统提供的pow可以成功编译。(man 里面提供的cos雷同例子)

4.如何正确的编写.so文件?(网上搜来搜去就那几种,无法正确编译成功。连dlsym我都是搞了好久才搞对。)

dlopen都没有报错,就是dlsym的时候有问题,undefined symbol
以下是我编译的时候的参数:
g++ test1.cpp -shared -o test1.so
g++ -rdynamic -o myso myso.cpp test1.so -ldl
...全文
1713 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
brookqdc 2007-08-19
  • 打赏
  • 举报
回复
mark
hyg2008 2007-04-24
  • 打赏
  • 举报
回复
mark
playmud 2007-04-24
  • 打赏
  • 举报
回复
dlopen正常dlsym也应该正常诶
2,因为c和c++对于类型要求的严格程度不同,pStrlenFun = dlsym(pdlHandle, "Strlen"); 用c编译器可以成功c++编译器会要求类型.
3,4的问题都是你没有指定动态库的路径的原因
bobya2003 2007-04-24
  • 打赏
  • 举报
回复
mark
friday5pm 2007-04-24
  • 打赏
  • 举报
回复
to yuanchuang(元创):
这种是隐式调用的方法,我上面已经说过,是可以的。但是我需要显示的调用方式。

to lei8766(lei8766):
你的方法我还没有试过。另外,如果dlopen是正确的,会还是连接不上的情况么?
friday5pm 2007-04-24
  • 打赏
  • 举报
回复
#######创建和使用静态库#########

详细的使用情况,请大家man手册,这里只介绍一下。静态库相对的比较简单。

创建一个静态库是相当简单的。通常使用 ar 程序把一些目标文件(.o)组合在一起,
成为一个单独的库,然后运行 ranlib,以给库加入一些索引信息。

########创建和使用共享库#########
特殊的编译和连接选项
-D_REENTRANT 使得预处理器符号 _REENTRANT 被定义,这个符号激活一些宏特性。
-fPIC 选项产生位置独立的代码。由于库是在运行的时候被调入,因此这个
选项是必需的,因为在编译的时候,装入内存的地址还不知道。如果
不使用这个选项,库文件可能不会正确运行。
-shared 选项告诉编译器产生共享库代码。
-Wl,-soname -Wl 告诉编译器将后面的参数传递到连接器。而 -soname 指定了
共享库的 soname。
# 可以把库文件拷贝到 /etc/ld.so.conf 中列举出的任何目录中,并以
root 身份运行 ldconfig;或者
# 运行 export LD_LIBRARY_PATH='pwd',它把当前路径加到库搜索路径中去。
friday5pm 2007-04-24
  • 打赏
  • 举报
回复
to comet(黄昏十二乐章) :
果然如此。
这个问题没有想到我?

网上的例子都是c的,所以不存在这个问题。

主要目标解决。
次要的再放两天好了。

再追加一个问题:
如何看.so文件的输出列表?
当时我也怀疑过的,但是不知道如何象windows下面看动态链接库的输出列表
comet 2007-04-24
  • 打赏
  • 举报
回复
C++的命名约定问题

函数加上 extern "C" 就好了
friday5pm 2007-04-24
  • 打赏
  • 举报
回复
to playmud((猪头流氓)(抵制日货)(再次鄙视老迈)) :
分析了下,隐式调用成功,说明.so编译没有多大问题;
调用系统的pow成功,说明显式调用流程没有多大问题;
那么应该就是 指定动态库的路径的问题,估计应该是编译的时候指定(都可以dlopen还是有路径问题,真是感觉奇怪)或放到系.so相关文件夹的吧。再看看。

另外: -fpic 的意义很好查,但是不知道其 “必要性”如何
好像.so 还有一个 -s 的编译选项,应该是 “不必要” 的吧。
lei8766 2007-04-23
  • 打赏
  • 举报
回复
g++ -rdynamic -o myso myso.cpp test1.so -ldl
此句写的可能有问题,
正确的写法:g++ -rdynamic -o myso myso.cpp -ldl -L./ -ltest1

如果是连接不上可能是因为你的LD_LIBRARY_PATH中没有你的动态库的路径

如果是在makefile中写还可以这样
....
myso: myso.cpp test1.so
g++ -rdynamic -o myso myso.cpp
yuanchuang 2007-04-23
  • 打赏
  • 举报
回复
g++ test1.cpp -fpic -shared -o test1.so
调用包含头文件,不需要那些动态库的函数调用

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧