首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

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

2012-12-17 
如何用qt在linux中编写并使用动态链接库?想在linux中写动态链接库,貌似在linux中叫共享库。。共享库叫libmy.

如何用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
######################################################################



TEMPLATE = lib
TARGET = my
DEPENDPATH += . src
INCLUDEPATH += . src

# Input
HEADERS += src/libmy.h
SOURCES += src/libmy.cpp



libmy.pc
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/

Name: libmy
Description: libmy test
Version: 0.1
Requires:
Libs: -L${libdir} -lmy
Cflags: -I${includedir}


以上是编写库的demo


main.cpp
#include    "libmy.h"
#include    <QApplication>

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);

    MyLib *lib = new MyLib();
    lib->hello();

    app.exec();
    return 0;
}

在main.cpp的pro文件中,添加

CONFIG += link_pkgconfig
PKGCONFIG += libmy

连接到刚才编译的libmy库,
[其他解释]
太感谢楼上了!! 虽然我没太看懂。。。
那个libmy.pc文件是什么呢?qt creator的new file里木有啊。。。
谢谢谢谢了!
[其他解释]
还有就是 怎样在creator中把 libmy编译成.so文件的呢?。。。
[其他解释]
libmy.pc不是qt creator里的东西。在linux下使用动态库,不仅要有.so库文件和.h头文件,还要有在/usr/lib/pkgconfig下.pc文件,你可以看下/usr/lib/pkgconfig目录下的东西。
libmy.pc的作用,简单的来说就是告诉编译器,你需要的库以及其头文件的在哪。
[其他解释]
引用:
还有就是 怎样在creator中把 libmy编译成.so文件的呢?。。。


qt creator中编译动态库,在pro文件中有TEMPLATE这个关键字段,TEMPLATE = app是编译成可以执行程序,TEMPLATE = lib则是编译成动态库。
[其他解释]
是load()失败了吧,linux下貌似加载动态库时,库名是自动加上lib的
QLibrary mylib("my"); //这样试看看
[其他解释]
能明白您的意思了,可是我尝试了您的方法 它却总是提示错误:
error: undefined reference to `libmy::libmy(QObject*)'
error: undefined reference to `libmy::hello()'

另外我的 libmy.pc是这样写的:
prefix=/home/hel/Documents
exec_prefix=${prefix}
libdir=${exec_prefix}/Libmy-build-desktop
includedir=${prefix}/Libmy
 
Name: libmy
Description: libmy test
Requires:
Libs: -L${libdir} -lmy
Cflags: -I${includedir}


您看对吗?
[其他解释]
在网上看到很多关于共享库的方法。有用QLibrary的 (就是我一开始用的那个方法)。还有http://laokaddk.blog.51cto.com/368606/489815 这片文章里说的方法,这个我尝试了倒是可以用,但跟Qt没什么关系了啊。。如果是在用Qt写的程序里 就没法用了哎。。
再有就是2楼那位大哥说的方法,还在尝试中。。

这些方法到底是什么关系呢。。。纠结。。
[其他解释]
引用:
能明白您的意思了,可是我尝试了您的方法 它却总是提示错误:
error: undefined reference to `libmy::libmy(QObject*)'
error: undefined reference to `libmy::hello()'

另外我的 libmy.pc是这样写的:
C/C++ code12345678910prefix=/……


编译出来的.so库文件,必须放在/usr/lib目录下,libmy.h放在/usr/include下,这些都是linux系统默认的,如果要改变的话,好像要更改环境变量。

你出现的问题就应该没是有放到默认目录下。


[其他解释]
Qt可以说是c++的一个图形库,本质的东西还是c++。
[其他解释]
我把.so 和.h复制过去了,还是提示那个错误。。。怎么回事呢?
[其他解释]
.pc文件改了没有?
另外,你在需要调用动态库的程序的pro文件中加以下设置没有?
CONFIG += link_pkgconfig
PKGCONFIG += libmy
[其他解释]

引用:
.pc文件改了没有?
另外,你在需要调用动态库的程序的pro文件中加以下设置没有?
CONFIG += link_pkgconfig
PKGCONFIG += libmy

恩 .pc是这样的
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/
 
Name: libmy
Description: libmy test
Requires:
Libs: -L${libdir} -lmy
Cflags: -I${includedir}


pro文件中也加了那两句话
[其他解释]
你使用命令ldd+你编译出来的可执行程序,贴下输出内容
[其他解释]
引用:
你使用命令ldd+你编译出来的可执行程序,贴下输出内容

您的意思是 ldd libmy.so吗?
输出的是:

linux-gate.so.1 =>  (0x00c15000)
libQtGui.so.4 => /usr/local/Trolltech/Qt-4.5.2/lib/libQtGui.so.4 (0x00c16000)
libXext.so.6 => /usr/lib/libXext.so.6 (0x00110000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x007cc000)
libQtCore.so.4 => /usr/local/Trolltech/Qt-4.5.2/lib/libQtCore.so.4 (0x00120000)
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0x00365000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x003a0000)
libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0x00b5f000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x003a4000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x0036e000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0049a000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x004b9000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0x0062f000)
/lib/ld-linux.so.2 (0x00a9d000)
libXau.so.6 => /usr/lib/libXau.so.6 (0x00956000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00394000)

感觉很诡异啊。。。
[其他解释]
引用:
不是ldd libmy.so,比如说,我三楼的代码,main.cpp编译出来的可以执行文件叫test,ldd test

看libmy.so.1 => 后面跟的是什么。


哦~~~不好意思。。。
但是由于Qt提示那两个错误 所以还不能编译出可执行文件呐。。。
[其他解释]


不是ldd libmy.so,比如说,我三楼的代码,main.cpp编译出来的可以执行文件叫test,ldd test

看libmy.so.1 => 后面跟的是什么。 
[其他解释]
那就是你没连接上库,我三楼的代码没错,可以运行。
[其他解释]
最近正弄动态链接库
[其他解释]
引用:
没这么复杂!你先创建一个库项目,编译出一个.so的动态库文件。里边其实就是一个类。
然后你就写个demo来使用这个.so .先在你的.pro里边加上LIBS += -L/ThePathLibFileLocated -lYourLib
还有INCLUDEPATH+= LibHeaderFilePath 如果找不到你的so文件,偷懒的办法就是把你的so 文件copy到系统……



楼上正解!
在pro里写了LIBS += -L/ThePathLibFileLocated -lYourLib 程序就运行了!

感谢这个帖子里的所有人!!!!!!

[其他解释]
学习一下,牛人真多

热点排行