当前位置: 代码迷 >> QT开发 >> 怎么用qt在linux中编写并使用动态链接库
  详细解决方案

怎么用qt在linux中编写并使用动态链接库

热度:37   发布时间:2016-04-25 04:19:56.0
如何用qt在linux中编写并使用动态链接库?
想在linux中写动态链接库,貌似在linux中叫共享库。。
共享库叫libmy.so
程序如下:
libmy.h

#ifndef LIBMY_H
#define LIBMY_H

#include "libmy_global.h"

class LIBMYSHARED_EXPORT Libmy {
public:
    Libmy();
    virtual void hello();
};

extern "C" Libmy* instanceOf();

#endif // LIBMY_H

libmy.cpp

#include "libmy.h"
#include <stdio.h>


Libmy::Libmy()
{

}

void Libmy::hello()
{
    printf("hello mylib!\n");
}

Libmy* instanceOf()
{
    return new Libmy();
}

调用共享库的程序如下:
#include <iostream>
#include <QLibrary>
#include "/home/hrl/Documents/libmy/libmy.h"
typedef Libmy* (*Instanceof)();
int main(int argc, char *argv[])
{
    QLibrary mylib("libmy");

    if(mylib.load())
    {
        Instanceof instanceof = (Instanceof)mylib.resolve("instanceof");
        if(instanceof)
        {
            Libmy *libmy = instanceof();
            libmy->hello();
            delete libmy;
        }
    }
    else
        std::cout << "DLL is not loaded!"<<std::endl;
    return 0;
}
结果。。
既不输出 "DLL is not loaded!"
也不输出 "hello mylib!
肿么回事啊。。。。
------最佳解决方案--------------------
首先,你把libmy编译成库没有?
其次,要把编译出来的库文件copy到/usr/lib目录下,还要写libmy.pc文件并copy到/usr/lib/pkgconfig目录
------其他解决方案--------------------
没这么复杂!你先创建一个库项目,编译出一个.so的动态库文件。里边其实就是一个类。
然后你就写个demo来使用这个.so .先在你的.pro里边加上LIBS += -L/ThePathLibFileLocated -lYourLib
还有INCLUDEPATH+= LibHeaderFilePath 如果找不到你的so文件,偷懒的办法就是把你的so 文件copy到系统lib路径下。要么就设置环境变量LD_LIBRARY_PATH加上你的so文件所在路径。
------其他解决方案--------------------
libmy.h
#ifndef  LIBMY_H
#define  LIBMY_H

#include  <QObject>

class MyLib : public QObject
{
public:
    MyLib();
    ~MyLib();

    void hello();
};
#endif  /*LIBMY_H*/


libmy.cpp
#include    "libmy.h"
#include    <QtDebug>

MyLib::MyLib()
{
}

MyLib::~MyLib()
{
}

void MyLib::hello()
{
    qDebug() << "hello world~!";
}


libmy.pro
######################################################################
# Automatically generated by qmake (2.01a) ?? 11? 7 17:17:14 2012
######################################################################