如何用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的作用,简单的来说就是告诉编译器,你需要的库以及其头文件的在哪。
[其他解释]
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楼那位大哥说的方法,还在尝试中。。
这些方法到底是什么关系呢。。。纠结。。
[其他解释]
编译出来的.so库文件,必须放在/usr/lib目录下,libmy.h放在/usr/include下,这些都是linux系统默认的,如果要改变的话,好像要更改环境变量。
你出现的问题就应该没是有放到默认目录下。
[其他解释]
Qt可以说是c++的一个图形库,本质的东西还是c++。
[其他解释]
我把.so 和.h复制过去了,还是提示那个错误。。。怎么回事呢?
[其他解释]
.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 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)
感觉很诡异啊。。。
[其他解释]
哦~~~不好意思。。。
但是由于Qt提示那两个错误 所以还不能编译出可执行文件呐。。。
[其他解释]
不是ldd libmy.so,比如说,我三楼的代码,main.cpp编译出来的可以执行文件叫test,ldd test
看libmy.so.1 => 后面跟的是什么。
[其他解释]
那就是你没连接上库,我三楼的代码没错,可以运行。
[其他解释]
最近正弄动态链接库
[其他解释]
楼上正解!
在pro里写了LIBS += -L/ThePathLibFileLocated -lYourLib 程序就运行了!
感谢这个帖子里的所有人!!!!!!
[其他解释]
学习一下,牛人真多