Ubuntu+Qt Creator 3.0.1(Base on Qt5.2.1 GCC 4.8.2.32Bit).so文件的制作与调用
全部源码下载地址:
https://download.youkuaiyun.com/download/xjzdr/15544581
开发环境:
1、创建动态链接库:项目名称:MyubuntuLib
保存路径:/root/MyQtDemo
新建一个Qt Creator项目,Libraries -> C++ Library,类型为Shared Library,一路Next。
- 编写自己的函数:
在文件myubuntulibaa.h中添加申请并对外开放。
extern "C" {
MYUBUNTULIBSHARED_EXPORT int myAdd(int x, int y);
MYUBUNTULIBSHARED_EXPORT int myAdd2();
}
注意:MYUBUNTULIBSHARED_EXPORT与类的名称是一样的。
然后在文件myubuntulibaa.cpp中添加实现:
int myAdd(int x,int y)
{
return x+y;
}
int myAdd2()
{
return 3;
}
编译后,自成.so文件:libMyubuntuLib.so(前面会自动加lib3个字母)。如下图:
2、动态调用.so文件
创建项目名称:QLibraryStaticUse
同Windows环境下一样,添加引用:
#include <QLibrary>
#include <QDebug>
添加一个按钮,然后在按钮的Click函数下添加如下代码:
void MainWindow::on_pushButton_clicked()
{
QLibrary lib("libMyubuntuLib");//可以带后缀,也可以不写后缀,
//可以用libMyubuntuLib、MyubuntuLib、libMyubuntuLib.so、MyubuntuLib.so
// 加载共享库
if (lib.load()) {
typedef int (*AddFunction)(int, int); //
// 解析符号
AddFunction add = (AddFunction) lib.resolve("myAdd");
if (add) {
int result = add(9, 5);
qDebug() << result;
}
else {
qDebug() << "Can not resolve subtract333";
} // 卸载共享库
lib.unload();
}
else
{
qDebug() << lib.errorString();
}
}
代码截图:
运行结果:
找不到.so文件的解决办法:
"Cannot load library libMyubuntuLib: (libMyubuntuLib: cannot open shared object file: No such file or directory)"
网上的解决办法很多,大体上有几种 :
- 将libMyubuntuLib.so文件的路径添加环境变量
在QT的Project里面添加一个环境变量:
LD_LIBRARY_PATH,值设置为::/root/MyQtDemo/build-MyubuntuLib-Desktop-Debug
(即libMyubuntuLib.so所在的路径)
添加后的截图:
经测试:添加环境变量后,即可立即生效,不需要重新启动,。
- 将libMyubuntuLib.so文件拷贝到系统查找的路径下面
- 将.so文件路径的目录添加到/etc/ld.so.conf
前面的2种没有试成功。最后一种成功了,也是网上推荐的办法:
运行:gedit /etc/ld.so.conf
在文件最后添加一行:
include /root/MyQtDemo/build-MyubuntuLib-Desktop-Debug
网上资料说的:添加并保存后执行的命令,使配置生效:
/sbin/ldconfig
经测试执行此命令后,并没有立即生效。我是reboot后生效了。