日期:2014-05-16  浏览次数:20859 次

Linux下创建和调用动态链接库(.so)相关问题。高手进!
简单开始提问:
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

------解决方案--------------------
g++ test1.cpp -fpic -shared -o test1.so
调用包含头文件,不需要那些动态库的函数调用
------解决方案--------------------
dlopen正常dlsym也应该正常诶
2,因为c和c++对于类型要求的严格程度不同,pStrlenFun = dlsym(pdlHandle, "Strlen "); 用c编译器可以成功c++编译器会要求类型.
3,4的问题都是你没有指定动态库的路径的原因

------解决方案--------------------
C++的命名约定问题

函数加上 extern "C " 就好了