怎样看下 qt tiny210 /usr/usr local bin/t

c++ - How to use Qt app on tiny210 device? - Stack Overflow
to customize your list.
Announcing Stack Overflow Documentation
We started with Q&A. Technical documentation is next, and we need your help.
Whether you're a beginner or an experienced developer, you can contribute.
I want to use a Qt app on a .
I installed Qt ( qt-everywhere-opensource-src.4.8.5 ) downloaded from . I managed to compile a simple application for use on tiny210. The problem is that now when I try to run the app on the device, I get the following errors:
libc.so.6: version 'GLIBC_2.15' not found (required by libQtCore.so.4)
libc.so.6: version 'GLIBC_2.15' not found (required by libQtNetwork.so.4)
There is a libc.so.6 in /lib/ on the target device, but it is version 2.11.
I should mention that before getting those errors I also got errors for not having libQtCore.so.4, libQtNetwork.so.4 and libQtGui.so.4. I fixed those errors just by copying the compiled libraries from my host PC to the device.
First question is: Would there have been a better way to provide the needed libraries, or copying them is fine?
Second question is: How can I get over the errors mentioned above?
EDIT : I've read something about building it static, but I am not sure how, and what are the downsides of this.
EDIT2 : I managed to get over the above errors thanks to artless noise's answer, but now I get: error loading shared libraries: libQtGui.so.4: cannot open shared object file: No such file or directory.
The issue is the cross-compiler (apt-get install gcc-arm-linux-gnueabi) is ARM based and this cross compiler has a newer glibc than on the ARM device.
You can copy the libc from the cross compiler directory to your ARM device.
I suggest testing with LD_LIBRARY_PATH, before updating the main libraries.
Use ls /var/lib/dpkg/info/*arm-linux*.list to see most packages related to the ARM compiler.
You can use grep to figure out where the libraries are (or fancier things like apt-file, etc).
Crosstool-ng has a
script, but I dont see it in the U it is perfect for your issue.
If it is present on your Debian version, I would use it.
The glibc 2.15 is backwards compatible with the glibc 2.11 which is currently on your system.
Issues may arise if the compiler was configured with different options (different ABI); however if this is the case, you will have many issues with your built Qt besides the library.
In this case, you need to find a better compiler which fits your root filesystem.
So to be clear, on the target
mkdir /lib/staging
cp libc.so-2.15 /lib/staging
cd /lib/staging
ln -s libc.so-2.15 libc.so
LD_LIBRARY_PATH=/lib/staging ls
# test the library
You may have to copy additional libraries, such as pthread, resolv, rt, crypt, etc.
The files are probably in a directory like sysroot/lib.
You can copy the whole directory to the /lib/staging to test it.
If the above ls functions, then the compilers should be ABI compatible.
If you have a crash or not an executable, then the compiler and rootfs may not be compatible.
Would there have been a better way to provide the needed libraries, or copying them is fine?
Copying may be fine as per above.
If it is not fine, then either the compiler or the root filesystem must be updated.
How can I get over the errors mentioned above?
Try the above method.
As well, you maybe able to leave your root filesystem alone.
Set-up a shadow directory and
to run the Qt application with the copied files as another solution.
To test this, make a very simple program and put it along the compiler libraries in a test directory, say /lib/staging as above.
Then the test code can be run like,
$ LD_LIBRARY_PATH=/lib/staging ./hello_world
If this doesn't work, your compiler and the ARM file system/OS are not compatible.
No library magic will help.
I've read something about building it static, but I am not sure how, and what are the downsides of this.
I understand this seems like a solution.
However, if the compiler is wrong, this won't help.
The calling convention between OS, libraries and what registers are saved by the OS will be implicit in the compiled code.
You may have to .
11.7k43665
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you're looking for?
Browse other questions tagged
Stack Overflow works best with JavaScript enabled1280人阅读
Linxu学习频道(24)
基于Tiny210开发板视频显示
<span style="font-size:24 color:#、写基于V4L2编程
========videodevice.h文件=========
#ifndef VIDEODEVICE_H
#define VIDEODEVICE_H
#include &string.h&
#include &stdlib.h&
#include &errno.h&
#include &fcntl.h&
#include &sys/ioctl.h&
#include &sys/mman.h&
#include &asm/types.h&
#include &linux/videodev2.h&
#include &QString&
#include &QObject&
#define WIDTH 320
#define HEIGHT 240
#define CLEAR(x) memset(&(x), 0, sizeof(x))
class VideoDevice : public QObject
VideoDevice(QString dev_name);
int open_device();
int close_device();
int init_device();
int start_capturing();
int stop_capturing();
int uninit_device();
int get_frame(void **, size_t*);
int unget_frame();
int init_mmap();
struct buffer
QString dev_
unsigned int n_
void display_error(QString);
#endif // VIDEODEVICE_H
========videodevice.cpp文件=========
#include &videodevice.h&
#include &stdio.h&
VideoDevice::VideoDevice(QString dev_name)
this-&dev_name = dev_
this-&fd = -1;
this-&buffers = NULL;
this-&n_buffers = 0;
this-&index = -1;
int VideoDevice::open_device()
fd = open(dev_name.toStdString().c_str(), O_RDWR/*|O_NONBLOCK*/, 0);
// fd = open(dev_name.toStdString().c_str(), O_RDWR|O_NONBLOCK, 0);
if(-1 == fd)
emit display_error(tr(&open: %1&).arg(QString(strerror(errno))));
return -1;
int VideoDevice::close_device()
if(-1 == close(fd))
emit display_error(tr(&close: %1&).arg(QString(strerror(errno))));
return -1;
int VideoDevice::init_device()
if(-1 == ioctl(fd, VIDIOC_QUERYCAP, &cap))
if(EINVAL == errno)
emit display_error(tr(&%1 is no V4l2 device&).arg(dev_name));
emit display_error(tr(&VIDIOC_QUERYCAP: %1&).arg(QString(strerror(errno))));
return -1;
if(!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE))
emit display_error(tr(&%1 is no video capture device&).arg(dev_name));
return -1;
if(!(cap.capabilities & V4L2_CAP_STREAMING))
emit display_error(tr(&%1 does not support streaming i/o&).arg(dev_name));
return -1;
CLEAR(cropcap);
cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if(0 == ioctl(fd, VIDIOC_CROPCAP, &cropcap))
CLEAR(crop);
crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
crop.c = cropcap.
if(-1 == ioctl(fd, VIDIOC_S_CROP, &crop))
if(EINVAL == errno)
emit display_error(tr(&VIDIOC_S_CROP not supported&));
emit display_error(tr(&VIDIOC_S_CROP: %1&).arg(QString(strerror(errno))));
return -1;
emit display_error(tr(&VIDIOC_CROPCAP: %1&).arg(QString(strerror(errno))));
return -1;
CLEAR(fmt);
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = WIDTH;
fmt.fmt.pix.height = HEIGHT;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
if(-1 == ioctl(fd, VIDIOC_S_FMT, &fmt))
emit display_error(tr(&VIDIOC_S_FMT&).arg(QString(strerror(errno))));
return -1;
if(-1 == init_mmap())
return -1;
fprintf(stderr,&========================\n&);
int VideoDevice::init_mmap()
CLEAR(req);
req.count = 4;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
if(-1 == ioctl(fd, VIDIOC_REQBUFS, &req))
if(EINVAL == errno)
emit display_error(tr(&%1 does not support memory mapping&).arg(dev_name));
return -1;
emit display_error(tr(&VIDIOC_REQBUFS %1&).arg(QString(strerror(errno))));
return -1;
if(req.count & 2)
emit display_error(tr(&Insufficient buffer memory on %1&).arg(dev_name));
return -1;
buffers = (buffer*)calloc(req.count, sizeof(*buffers));
if(!buffers)
emit display_error(tr(&out of memory&));
return -1;
for(n_buffers = 0; n_buffers & req. ++n_buffers)
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = n_
if(-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf))
emit display_error(tr(&VIDIOC_QUERYBUF: %1&).arg(QString(strerror(errno))));
return -1;
buffers[n_buffers].length = buf.
buffers[n_buffers].start =
mmap(NULL, // start anywhere
buf.length,
PROT_READ | PROT_WRITE,
MAP_SHARED,
fd, buf.m.offset);
if(MAP_FAILED == buffers[n_buffers].start)
emit display_error(tr(&mmap %1&).arg(QString(strerror(errno))));
return -1;
int VideoDevice::start_capturing()
for(i = 0; i & n_ ++i)
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory =V4L2_MEMORY_MMAP;
buf.index =
fprintf(stderr, &n_buffers: %d\n&, i);
if(-1 == ioctl(fd, VIDIOC_QBUF, &buf))
emit display_error(tr(&VIDIOC_QBUF: %1&).arg(QString(strerror(errno))));
return -1;
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if(-1 == ioctl(fd, VIDIOC_STREAMON, &type))
emit display_error(tr(&VIDIOC_STREAMON: %1&).arg(QString(strerror(errno))));
return -1;
int VideoDevice::stop_capturing()
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if(-1 == ioctl(fd, VIDIOC_STREAMOFF, &type))
emit display_error(tr(&VIDIOC_STREAMOFF: %1&).arg(QString(strerror(errno))));
return -1;
int VideoDevice::uninit_device()
for(i = 0; i & n_ ++i)
if(-1 == munmap(buffers[i].start, buffers[i].length))
emit display_error(tr(&munmap: %1&).arg(QString(strerror(errno))));
return -1;
free(buffers);
int VideoDevice::get_frame(void **frame_buf, size_t* len)
v4l2_buffer queue_
CLEAR(queue_buf);
queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
queue_buf.memory = V4L2_MEMORY_MMAP;
if(-1 == ioctl(fd, VIDIOC_DQBUF, &queue_buf))
switch(errno)
case EAGAIN:
perror(&dqbuf&);
return -1;
return -1 ;
emit display_error(tr(&VIDIOC_DQBUF: %1&).arg(QString(strerror(errno))));
return -1;
*frame_buf = buffers[queue_buf.index].
*len = buffers[queue_buf.index].
index = queue_buf.
int VideoDevice::unget_frame()
if(index != -1)
v4l2_buffer queue_
CLEAR(queue_buf);
queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
queue_buf.memory = V4L2_MEMORY_MMAP;
queue_buf.index =
if(-1 == ioctl(fd, VIDIOC_QBUF, &queue_buf))
emit display_error(tr(&VIDIOC_QBUF: %1&).arg(QString(strerror(errno))));
return -1;
return -1;
<span style="font-size:24 color:#、调用V4L2编程
======showmain.h文件======
#ifndef SHOWMAIN_H
#define SHOWMAIN_H
#include &QMainWindow&
#include &QRect&
#include &QTimer&
#include &cv.h&
#include &highgui.h&
#include &QtGui&
#include &QString&
#include &QVector&
#include &videodevice.h&
#include &QImage&
#include &QTime&
namespace Ui {
class ShowM
class ShowMain : public QMainWindow
explicit ShowMain(QWidget *parent = 0);
~ShowMain();
VideoDevice *
QPainter *
QImage *frame1;
IplImage *
QTimer *timer1;
int convert_yuv_to_rgb_pixel(int y, int u, int v);
int convert_yuv_to_rgb_buffer(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height);
private slots:
void paintEvent1();
Ui::ShowMain *
#endif // SHOWMAIN_H
======showmain.cpp文件======
#include &showmain.h&
#include &ui_showmain.h&
extern &C&
#include &stdio.h&
#include &stdlib.h&
ShowMain::ShowMain(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::ShowMain)
ui-&setupUi(this);
pp = (unsigned char *)malloc(WIDTH * HEIGHT/*QWidget::width()*QWidget::height()*/* 4 * sizeof(char));
frame = new QImage(pp,WIDTH,HEIGHT,QImage::Format_RGB888);
//此处必须使用rgb888格式
vd = new VideoDevice(tr(&/dev/video0&));
rs = vd-&open_device();
if(-1==rs)
QMessageBox::warning(this,tr(&error&),tr(&open /dev/dsp error&),QMessageBox::Yes);
vd-&close_device();
rs = vd-&init_device();
if(-1==rs)
QMessageBox::warning(this,tr(&error&),tr(&init failed&),QMessageBox::Yes);
vd-&close_device();
rs = vd-&start_capturing();
if(-1==rs)
QMessageBox::warning(this,tr(&error&),tr(&start capture failed&),QMessageBox::Yes);
vd-&close_device();
if(-1==rs)
QMessageBox::warning(this,tr(&error&),tr(&get frame failed&),QMessageBox::Yes);
vd-&stop_capturing();
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(paintEvent1()));
timer-&start(30);
void ShowMain::paintEvent1()
rs = vd-&get_frame((void **)&p,&len);
rs = vd-&get_frame((void **)&p,&len);
convert_yuv_to_rgb_buffer(p,(unsigned char*)pp,WIDTH, HEIGHT);
ui-&label-&setPixmap(QPixmap::fromImage(*frame,Qt::AutoColor));
rs = vd-&unget_frame();
//将yuyv转rgb888
int ShowMain::convert_yuv_to_rgb_buffer(unsigned char *yuv, unsigned char *rgb, unsigned int width, unsigned int height)
unsigned int in, out = 0;
unsigned int pixel_16;
unsigned char pixel_24[3];
unsigned int pixel32;
int y0, u, y1,
for(in = 0; in & width * height * 2; in += 4) {
pixel_16 =
yuv[in + 3] && 24 |
yuv[in + 2] && 16 |
yuv[in + 1] &&
yuv[in + 0];
y0 = (pixel_16 & 0x000000ff);
= (pixel_16 & 0x0000ff00) &&
y1 = (pixel_16 & 0x00ff0000) && 16;
= (pixel_16 & 0xff000000) && 24;
pixel32 = convert_yuv_to_rgb_pixel(y0, u, v);
pixel_24[0] = (pixel32 & 0x000000ff);
pixel_24[1] = (pixel32 & 0x0000ff00) && 8;
pixel_24[2] = (pixel32 & 0x00ff0000) && 16;
rgb[out++] = pixel_24[0];
rgb[out++] = pixel_24[1];
rgb[out++] = pixel_24[2];
pixel32 = convert_yuv_to_rgb_pixel(y1, u, v);
pixel_24[0] = (pixel32 & 0x000000ff);
pixel_24[1] = (pixel32 & 0x0000ff00) && 8;
pixel_24[2] = (pixel32 & 0x00ff0000) && 16;
rgb[out++] = pixel_24[0];
rgb[out++] = pixel_24[1];
rgb[out++] = pixel_24[2];
int ShowMain::convert_yuv_to_rgb_pixel(int y, int u, int v)
unsigned int pixel32 = 0;
unsigned char *pixel = (unsigned char *)&pixel32;
r = y + (1.370705 * (v-128));
g = y - (0.698001 * (v-128)) - (0.337633 * (u-128));
b = y + (1.732446 * (u-128));
if(r & 255) r = 255;
if(g & 255) g = 255;
if(b & 255) b = 255;
if(r & 0) r = 0;
if(g & 0) g = 0;
if(b & 0) b = 0;
pixel[0] = r * 220 / 256;
pixel[1] = g * 220 / 256;
pixel[2] = b * 220 / 256;
return pixel32;
ShowMain::~ShowMain()
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:271483次
积分:3406
积分:3406
排名:第6802名
原创:90篇
译文:20篇
评论:44条
(1)(1)(1)(1)(3)(7)(1)(1)(2)(2)(2)(17)(3)(9)(15)(17)(5)(9)(14)二次元同好交流新大陆
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
然后添加一个定时器,定时器时间为500ms,即每500ms扫描一次,如下:[cpp]&注意这里最关键的就是[cpp]&这个函数,接收消息存至buf里。但默认的hotplug_sock是阻塞的,也就是当执行到recv时,程序就会停在这里,直到再次接收到内核新的消息,程序才会往下执行。为此,程序必须改动,一种思路是开一个线程,专门运行recv,停在那也无所谓;另外一种思路是将这个sock改成非阻塞的,改动部分见.h文件里画红线部分!&&& int flags=fcntl(hotplug_sock, F_GETFL,0);&&& fcntl(hotplug_sock, F_SETFL, flags | O_NONBLOCK);当内核没有消息时,recv()之后的buf是空的。 交叉编译后,程序至Tiny210里运行良好!上一张效果图:但遗憾的是,工业是这么做是很不高明的,为了扫描一个U盘要开一个定时器在那扫描,因此最终采用判断/proc/scsi/usb-storage是否存在来判断u盘是否插入。曾考虑过U盘插入后,挂载点/udisk是否存在来判断。但当用户在/udisk目录下时,这时突然拔掉U盘。/udisk就会存在,而且ls查看的结果是报错。这时因为未推出U盘目录就拔掉,linux无法正常卸载造成的。当U盘插入良好时,usb-storage文件夹里会有三个文件,当卸载不成功时,会有两个文件。当卸载成功时,usb-storage这个文件夹会消失。采用像/udisk里写测试文件来判断/udisk是否可用,不可用的话就提示给用户:[cpp]&查询U盘状态的槽函数:[cpp]&[cpp]&这样就能正常检测U盘了,如果想加进度条就加上。不加,也能正常检测。&&&&& 问题又来了,上面采用向/udisk里写测试文件来检测/udisk是否可用,但有时用户会将U盘进行写保护。我试遍所有的方法,用open、opendir、access、stat等来检查异常情况下/udisk的属性与正常状态有何不同,最终也没查出来。也用了ls /udisk & /a.txt,截取ls的内容。但当/udisk出现异常时,报错的内容是板子上报的,并不是ls显示的内容。ls此时显示结果为空。& & & 其实,与其判断这种误拔U盘的行为,倒不如防止。经过我研究发现,当ls出现/udisk fatal error,只要执行/umount /udisk,手动将这个文件夹卸载,再次插上U盘就可以了。为此,大家看到我上面程序里,当检测dir.count == 2时,检查/udisk是否存在,如果存在则将/udisk卸载。& 这样做基本算完美解决问题了。美中不足的是,当异常出现时,如果板子程序一直在运行,则拔掉U盘再插上无事。如果此时板子重启,在板子重启前就将U盘再次插入到板子,这时候因为咱们的应用程序还未运行,还没有执行 umount /udisk,这个时候程序就检测不出来了。& & && 要避免这个问题,就采用往U盘里写数据的方法判断,或者如果允许扫描用hostplug查询出来的信息可以得知usb的注册情况,这种思路应该也可以。一个小小的U盘检测,终于告一段落了,实现了x86下、arm平台均可用的qt检测U盘!----------------yanzi1225627&&&&&&&&& 这里给一个源码资源,是老外写的,用qtcpsocket来监听netlink的消息,老外写的代码就是不一样啊,大家参考吧:http://download.csdn.net/detail/yanzi4740
阅读(382)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Arm平台 Qt检测U盘插拔(三)-----蛋疼的recv()阻塞',
blogAbstract:'因为最终要在tiny210上实现此功能,最终选择了hotplug。/hdy5200075/item/f3d12a100ef3f6这里是hotplug检测U盘的源码,我在qt里将其写到一个hostplug.h文件里。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:1,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}谁有最新版QT下载地址?200分等你来拿哦_百度知道
谁有最新版QT下载地址?200分等你来拿哦
,偶想要企业版~但是偶没钱.虽然没验证过,提供注册机的那种或者,不是说那个免费版,所以老版本的不能用了,给我一个也可以哦~因为用的是vs2008.,所以偶要的是盗版的企业版如题,最新版的应该可以,要是有人有那个企业版的注册码
你会我也会,我要的不是开源的那个,拜托..。麻烦不要把迅雷搜索的东西扔上来,很拜托的看清楚麻烦.下面的七个答案都不满意,是商业版的那个
提问者采纳
configure -plugin-sql-mysql -plugin-sql-sqlite -plugin-sql-odbc &#92;usr&#47.安装环境  主机.2/  &gt:$PATH  QTDIR=/mysql  LIBS += -L&#47.配置  $.2.pro在最开始处,  加上下面两行  INCLUDEPATH += &#47.make install  3;-plugin-sql-psql  修改一下文件src&#47,然后运行  $;usr/Qt-4;etc/profile文件中添加如下两行  PATH=/mysql.QT安装  1  Qt 是一个跨平台的 C++ 图形用户界面库,  libqsqlmysql_debug.0:qt-x11-opensource-src-4,目前包括Qt.0/Qt  4.80-7  软件.Trolltech&#47,退出来,国际化工具 Qt Linguist 等部分 Qt 支持所有 Unix 系统;usr/sqldrivers&#47.1.编译&建立  make  3).Trolltech&#47,要加上如下配置项  $;lib&#47, 基于 Framebuffer 的 Qt Embedded,由挪威 TrollTech 公司出品;qt&#47./98 平台,当然也包括 LTrolltech/mysql/local/local/plugins/usr/Qt-4;configure --help查看;usr&#47, sqlite.&#47,依据自己需要  选择option)  2);local&#47,还支持 WinNT&#47:Red Hat Fedora Core 4  编译器;configure -plugin-sql-mysql -plugin-sql-sqlite -plugin-sql-odbc &#92.so拷贝到/目录下面的libqsqlmysql,完成  下载地址;local&#47.1.1:gcc-4;Win2k.2&#47,Win95&#47,运行  make  然后把plugins&#47:/usr/Qt-4.0-8 make-3.2  $export QTDIR  (可以在&#47.建立环境变量  $PATH=&#47。  .com/local&#47:  sqldrivers/Qt-4;-plugin-sql-psql -continue  $make  $make install  转到src&#47, odbc.gz  2;sqldrivers&#47.安装过程  1).1;mysql  (否则可能会提示找不到mysql函数)  保存后.3;sqldrivers目录下面;configure [--option]  (具体配置选项可以用./Trolltech/plugins/目录下;Trolltech&#47.2  export QTDIR PATH  )  4;mysql/usr&#47.1:$PATH  $export PATH  $QTDIR=&#47.2-mingw.1;bin, mysql的驱动  在configure的时候.安装source/include/qt-win-opensource-4./  &gt.plugins/&#47,快速开发工具 Qt Designer
提问者评价
看你比较辛苦...虽然没达到我的要求商业版啊商业版...
其他类似问题
为您推荐:
其他6条回答
。而免费版对你(相信是初学者)也绝对足够了,专业版啊,要什么企业版,只是专业版多了几个工具能用而己!年轻人,QT的免费版和专业版功能完全是一样的
一般都要花钱的呀呵呵像这种专业性强的软件,网上资源极少很可能没有!所以建议你去当地的买软件的地方买去,几块钱,呵呵!在北京的话去中关村!去买那的手刻的,呵呵!就OK了!
都是QQ官方的.绝对安全.请给分.
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 linux usr local 的文章

 

随机推荐