如何用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*/
#include "libmy.h"
#include <QtDebug>
MyLib::MyLib()
{
}
MyLib::~MyLib()
{
}
void MyLib::hello()
{
qDebug() << "hello world~!";
}
######################################################################
# 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
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}
#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;
}
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}
[其他解释]
Qt可以说是c++的一个图形库,本质的东西还是c++。
[其他解释]
我把.so 和.h复制过去了,还是提示那个错误。。。怎么回事呢?
[其他解释]
.pc文件改了没有?
另外,你在需要调用动态库的程序的pro文件中加以下设置没有?
CONFIG += link_pkgconfig
PKGCONFIG += libmy
[其他解释]
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}