• 9065阅读
  • 10回复

[提问]QT怎么调用C++的动态库 [复制链接]

上一主题 下一主题
离线toolc
 
只看楼主 倒序阅读 楼主  发表于: 2011-05-14
    准备用QT写一个界面,用界面读取文本数据,具体计算的方法用C++编好的动态库中的函数执行,最后把计算的结果显示在界面上,请问怎么调用?最好有代码或者例子说明。不胜感激
离线XChinux

只看该作者 1楼 发表于: 2011-05-14
有没有头文件?有头文件的话,将头文件包含进来,然后在.pro中加上
LIBS += -L/your/lib/path  -lyour_lib_name
就可以了。

也可以用QLibrary来加载。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线zhy282289
只看该作者 2楼 发表于: 2011-05-14
用QLibrary来加载了,实在不行你直接用C++里的加载方法不就行了
为什么我脸这么胖~
离线toolc
只看该作者 3楼 发表于: 2011-05-14
好,谢谢,试试去
离线时代海豚

只看该作者 4楼 发表于: 2011-05-21
编译和链接都通过了,运行时报错,请大虾看看这是怎么回事?
/home/lenovo/qtpro/dll_test-build-desktop/dll_test: error while loading shared libraries: libTax.so.1: cannot open shared object file: No such file or directory

qtcreator生成的动态链接库文件和软链接都在/home/lenovo/qtpro/Tax-build-desktop/里面,
dll_test的最后
unix:!macx:!symbian: LIBS += -L$$PWD/../Tax-build-desktop/ -lTax
INCLUDEPATH += $$PWD/../Tax-build-desktop
DEPENDPATH += $$PWD/../Tax-build-desktop
之前没有这一段,链接时报错,加上之后就变成上面提到的错误了
离线XChinux

只看该作者 5楼 发表于: 2011-05-21
$export LD_LIBRARY_PATH=/your_shrared_lib_path:$LD_LIBRARY_PATH
$/home/lenovo/qtpro/dll_test-build-desktop/dll_test

明白了嘛?要将共享库的路径加入到LD_LIBRARY_PATH路径中去。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线时代海豚

只看该作者 6楼 发表于: 2011-05-21
谢谢版主,能调通了!
但是有个问题,ubuntu取消了LD_LIBRARY_PATH这个环境变量,我不知道该怎么给这个变量设置默认值,每次都手动export太麻烦了吧……
不知道版主对ubuntu熟不熟啊?
离线XChinux

只看该作者 7楼 发表于: 2011-05-21
写shell脚本做辅助啊。
$vi dll_test.sh


#!/bin/sh
exedir=`dirname $0`
export LD_LIBRARY_PATH=$exedir/lib:$LD_LIBRARY_PATH
cd $exedir
./dll_test $1

$chmod +x dll_test.sh
[ 此帖被XChinux在2011-05-21 21:18重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线时代海豚

只看该作者 8楼 发表于: 2011-05-22
^_^~~谢谢版主啦~~果然经验丰富啊~~
离线时代海豚

只看该作者 9楼 发表于: 2011-05-22
又有问题了
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Tax *taxObject;
    QPluginLoader pluginLoader("/home/lenovo/qtpro/Tax-build-desktop/libTax.so");
    QObject *plugin = pluginLoader.instance();
    taxObject = qobject_cast<Tax *>(plugin);
    taxObject->setIncome(2200);
    float x=taxObject->incomeTax();
    std::cout<< x <<std::endl;
    return 0;
}
执行到taxObject->setIncome(2200);报错,Segmentation fault
之前Tax类里面没有放成员变量,参数直接传给incomeTax(),能正常输出结果。
是不是这种加载方式不支持访问获得的对象的成员变量,只能访问成员函数啊?
应该怎样解决这个问题?
离线sunism

只看该作者 10楼 发表于: 2011-05-29
我也有一个相关的问题,我编译的时候他说着不到相关的链接库,怎么我直接砸shell下面运行生成的文件没问题啊?
快速回复
限100 字节
 
上一个 下一个