如何用qt在linux中编写并使用动态链接库?

tuzi1262 2012-11-07 05:08:35
想在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!
肿么回事啊。。。。
...全文
2699 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
holymaple 2012-11-10
  • 打赏
  • 举报
回复
学习一下,牛人真多
donwmufromdying 2012-11-09
  • 打赏
  • 举报
回复
没这么复杂!你先创建一个库项目,编译出一个.so的动态库文件。里边其实就是一个类。 然后你就写个demo来使用这个.so .先在你的.pro里边加上LIBS += -L/ThePathLibFileLocated -lYourLib 还有INCLUDEPATH+= LibHeaderFilePath 如果找不到你的so文件,偷懒的办法就是把你的so 文件copy到系统lib路径下。要么就设置环境变量LD_LIBRARY_PATH加上你的so文件所在路径。
LinuxMan 2012-11-09
  • 打赏
  • 举报
回复
最近正弄动态链接库
moxiaofeng77 2012-11-09
  • 打赏
  • 举报
回复
那就是你没连接上库,我三楼的代码没错,可以运行。
tuzi1262 2012-11-09
  • 打赏
  • 举报
回复
引用 20 楼 foxyz 的回复:
没这么复杂!你先创建一个库项目,编译出一个.so的动态库文件。里边其实就是一个类。 然后你就写个demo来使用这个.so .先在你的.pro里边加上LIBS += -L/ThePathLibFileLocated -lYourLib 还有INCLUDEPATH+= LibHeaderFilePath 如果找不到你的so文件,偷懒的办法就是把你的so 文件copy到系统……
楼上正解! 在pro里写了LIBS += -L/ThePathLibFileLocated -lYourLib 程序就运行了! 感谢这个帖子里的所有人!!!!!!
moxiaofeng77 2012-11-08
  • 打赏
  • 举报
回复
引用 4 楼 tuzi1262 的回复:
还有就是 怎样在creator中把 libmy编译成.so文件的呢?。。。
qt creator中编译动态库,在pro文件中有TEMPLATE这个关键字段,TEMPLATE = app是编译成可以执行程序,TEMPLATE = lib则是编译成动态库。
moxiaofeng77 2012-11-08
  • 打赏
  • 举报
回复
libmy.pc不是qt creator里的东西。在linux下使用动态库,不仅要有.so库文件和.h头文件,还要有在/usr/lib/pkgconfig下.pc文件,你可以看下/usr/lib/pkgconfig目录下的东西。 libmy.pc的作用,简单的来说就是告诉编译器,你需要的库以及其头文件的在哪。
tuzi1262 2012-11-08
  • 打赏
  • 举报
回复
引用 17 楼 moxiaofeng77 的回复:
不是ldd libmy.so,比如说,我三楼的代码,main.cpp编译出来的可以执行文件叫test,ldd test 看libmy.so.1 => 后面跟的是什么。
哦~~~不好意思。。。 但是由于Qt提示那两个错误 所以还不能编译出可执行文件呐。。。
moxiaofeng77 2012-11-08
  • 打赏
  • 举报
回复
不是ldd libmy.so,比如说,我三楼的代码,main.cpp编译出来的可以执行文件叫test,ldd test 看libmy.so.1 => 后面跟的是什么。
tuzi1262 2012-11-08
  • 打赏
  • 举报
回复
引用 15 楼 moxiaofeng77 的回复:
你使用命令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) 感觉很诡异啊。。。
moxiaofeng77 2012-11-08
  • 打赏
  • 举报
回复
你使用命令ldd+你编译出来的可执行程序,贴下输出内容
tuzi1262 2012-11-08
  • 打赏
  • 举报
回复
引用 13 楼 moxiaofeng77 的回复:
.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文件中也加了那两句话
moxiaofeng77 2012-11-08
  • 打赏
  • 举报
回复
.pc文件改了没有? 另外,你在需要调用动态库的程序的pro文件中加以下设置没有? CONFIG += link_pkgconfig PKGCONFIG += libmy
tuzi1262 2012-11-08
  • 打赏
  • 举报
回复
我把.so 和.h复制过去了,还是提示那个错误。。。怎么回事呢?
moxiaofeng77 2012-11-08
  • 打赏
  • 举报
回复
Qt可以说是c++的一个图形库,本质的东西还是c++。
moxiaofeng77 2012-11-08
  • 打赏
  • 举报
回复
引用 8 楼 tuzi1262 的回复:
能明白您的意思了,可是我尝试了您的方法 它却总是提示错误: 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系统默认的,如果要改变的话,好像要更改环境变量。 你出现的问题就应该没是有放到默认目录下。
tuzi1262 2012-11-08
  • 打赏
  • 举报
回复
在网上看到很多关于共享库的方法。有用QLibrary的 (就是我一开始用的那个方法)。还有http://laokaddk.blog.51cto.com/368606/489815 这片文章里说的方法,这个我尝试了倒是可以用,但跟Qt没什么关系了啊。。如果是在用Qt写的程序里 就没法用了哎。。 再有就是2楼那位大哥说的方法,还在尝试中。。 这些方法到底是什么关系呢。。。纠结。。
tuzi1262 2012-11-08
  • 打赏
  • 举报
回复
能明白您的意思了,可是我尝试了您的方法 它却总是提示错误: 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}
您看对吗?
烂番 2012-11-08
  • 打赏
  • 举报
回复
是load()失败了吧,linux下貌似加载动态库时,库名是自动加上lib的 QLibrary mylib("my"); //这样试看看
tuzi1262 2012-11-07
  • 打赏
  • 举报
回复
还有就是 怎样在creator中把 libmy编译成.so文件的呢?。。。
加载更多回复(3)

16,216

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧