当前位置: 技术问答>linux和unix
Linux下创建和调用动态链接库(.so)相关问题。高手进!
来源: 互联网 发布时间:2016-02-06
本文导语: 简单开始提问: 1.生成.so时候 -fpic 的作用和必要性?我加上和去掉在隐式调用下没有区别 2. z=(double (*)(double,double))dlsym((char *)dp,"pow"); //pow函数 可以调用成功。 这个和网上到处搜索到的 pStrlenFun = dlsym(pdlHandl...
简单开始提问:
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
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
|
C++的命名约定问题
函数加上 extern "C" 就好了
函数加上 extern "C" 就好了
|
dlopen正常dlsym也应该正常诶
2,因为c和c++对于类型要求的严格程度不同,pStrlenFun = dlsym(pdlHandle, "Strlen"); 用c编译器可以成功c++编译器会要求类型.
3,4的问题都是你没有指定动态库的路径的原因
2,因为c和c++对于类型要求的严格程度不同,pStrlenFun = dlsym(pdlHandle, "Strlen"); 用c编译器可以成功c++编译器会要求类型.
3,4的问题都是你没有指定动态库的路径的原因
|
g++ test1.cpp -fpic -shared -o test1.so
调用包含头文件,不需要那些动态库的函数调用
调用包含头文件,不需要那些动态库的函数调用