qtcreator在Linux上调用失败,求助

qtcreator在Linux上调用失败,求助,第1张

不管是windows还是在Linux,出现这个问题首先考虑查看系统下是否安装有调试器

1.如果没有安装,则安装合适的调试器,然后转步骤3;

2.如果已安装调试器则查看QtCreator能否自动检测到。如果未检测到转步骤3.

3.设置调试器:在工具->选项->构建和运行->调试器中添加调试器。重启QtCreator即可。

ps: linux下使用 yum install gdb,安装gdb调试工具。

/* 打开设备并进行错误检查 */

int fd = open ("/dev/video",O_RDONLY)

if (fd==-1){

perror ("Can't open device")

return -1

}

/* 查询设备的输出格式 */

struct v4l2_format format

memset (&format,0,sizoef(format))

format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE

if (-1==ioctl(fd,VIDIOC_G_FMT,&format)){

perror ("While getting format")

return -2

}

/*

* 这里要将struct v4l2_format结构体置零,然后将

* format.type设定为V4L2_BUF_TYPE_VIDEO_CAPTURE,

* 这样在进行 VIDIOC_G_FMT 的ioctl时,驱动就会知

* 道是在捕获视频的情形下获取格式的内容。

* 成功返回后,format就含有捕获视频的尺寸大小及格

* 式。格式存储在 format.fmt.pix.pixelformat这个32

* 位的无符号整数中,共四个字节,以小头序存储。这里

* 介绍一种获取的方法。

*/

char code[5]

unsigned int i

for (i=0i<4i++) {

code[i] = (format.fmt.pix.pixelformat &(0xff<<i*8))>>i*8

}

code[4]=0

/* 现在的code是一个以\0结束的字符串。很多摄像头都是以格式MJPG输出视频的。

* MJPG是Motion JPEG的缩写,其实就是一些没填霍夫曼表的JPEG图片。

*/

/* 请求一定数量的缓冲区。

* 但是不一定能请求到那么多。据体还得看返回的数量

*/

struct v4l2_requestbuffers req

memset (&req,0,sizeof(req))

req.count = 10

req.type= V4L2_BUF_TYPE_VIDEO_CAPTURE

req.memory = V4L2_MEMORY_MMAP

if (-1==ioctl(fd,VIDIOC_REQBUFS,&req)){

perror ("While requesting buffers")

return -3

}

if (req.count <5){

fprintf (stderr, "Can't get enough buffers!\n")

return -4

}

/* 这里请求了10块缓存区,并将其类型设为MMAP型。 */

/* 获取缓冲区的信息

* 在 *** 作之前,我们必须要能记录下我们

* 申请的缓存区,并在最后使用munmap释放它们

* 这里使用结构体

* struct buffer {

* void * start

* ssize_t length

* } 以及buffer数量

* static int nbuffer

* 来表示

*/

struct buffer * buffers = (struct buffer *)malloc (nbuffer*sizeof(*buffers))

if (!buffers){

perror ("Can't allocate memory for buffers!")

return -4

}

struct v4l2_buffer buf

for (nbuffer=0nbuffer<req.count++nbuffer) {

memset (&buf,0,sizeof(buf))

buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE

buf.memory = V4L2_MEMORY_MMAP

buf.index= nbuffer

if (-1==ioctl(fd,VIDIOC_QUERYBUF,&buf)){

perror ("While querying buffer")

return -5

}

buffers[nbuffer].length = buf.length

buffers[nbuffer].start = mmap (

NULL,

buf.length,

PROT_READ, /* 官方文档说要加上PROT_WRITE,但加上会出错 */

MAP_SHARED,

fd,

buf.m.offset

)

if (MAP_FAILED == buffers[nbuffer].start) {

perror ("While mapping memory")

return -6

}

}

/*这个循环完成后,所有缓存区都保存在

*了buffers这个数组里了,完了就再将它们munmap即可。

*/

/* 打开视频捕获 */

enum v4l2_buf_type type

type = V4L2_BUF_TYPE_VIDEO_CAPTURE

if (-1==ioctl(fd,VIDIOC_STREAMON,&type)){

perror ("While opening stream")

return -7

}

/* 与内核交换缓冲区 */

unsigned int i

i=0

while(1) {

memset (&buf,0,sizeof(buf))

buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE

buf.memory = V4L2_MEMORY_MMAP

buf.index = i

if (-1==ioctl(fd,VIDIOC_DQBUF,&buf)){

perror ("While getting buffer's data")

return -8

}

/* 现在就得到了一片缓冲区的数据,发送处理 */

process_image ( buffers+buf.index,buf.index )

/* 将缓冲区交还给内核 */

if (-1==ioctl(fd,VIDIOC_QBUF,&buf)){

perror ("While returning buffer's data")

return -9

}

i = (i+1) &nbuffer

}

这就是所有获取的过程了。至于图像的处理,则是由解码函数和Qt来处理。现在先进行一些思路的设计。设想在进行图像的转换时,必须提供一块内存区域来进行,我们当然可以在转换时使用malloc来进行动态分配,转换完成并显示后,再将它free。然而这样做对内核而言是一个不小的负担:每次为一整张图片分配内存,最少也有上百KB,如此大的分配量和释放量,很容易造成内存碎片加重内核的负担。由于仅是每转换一次才显示一次图像,所以这片用于转换的内存区域可以安全地复用,不会同时由两个线程 *** 作之。因此在初始化时我们为每一块内存映射缓冲区分配一块内存区域作为转换用。对于MJPEG到JPEG的转换,使用相同的内存大小。代码就不在此列出了。这片假设这个内存区域的起始指针为convertion_buffers,在process_image (struct buffer * buf, int index ) 中,有

void process_image (struct buffer *buf, int index){

struct * buffer conv_buf = convertion_buffers+index

do_image_conversion (

buf->start, buf->length, /* 要转换的区域 */

conv_buf->start, conv_buf->length, /* 保存转换数据的区域 */

)

/* 现在就可以把数据取出并交给QPixmap处理

* 要在一个QWidget里作图,必须重载paintEvent

* 函数并用QPainter作画。然而paintEvent

* 是由事件驱动层调用的,我们不能手工,

* 所以在我们自己的的重载类里要保存一个全局

* 的QPixmap。这里设为 QPixmap * m_pixmap

*/

m_pixmap ->loadFromData (conv_buf->start,conv_buf->length)

/* 立即安排一次重绘事件 */

repaint ()

}

/* 重载的paintEvent示例 */

MyWidget::paintEvent (QPaintEvent * evt) {

QPainter painter(this)

painter.drawPixmap (QPoint(0,0),*m_pixmap)

QWidget::paintEvent(evt)

}

V4L搞定 +QT显示摄像头视频 +QT显示GIF动画 2009-11-02 09:32 哎 两星期前终于搞定了qt上显示摄像头视频采集 现在来把最终重要的代码总结下 QImage imgunsigned char *bit= v4l _dev.buffer/ /v41_dev.buffer为内存映射的地址 QRgb *pointint r, g, bQPainter paintif(img.create(MAX_WIDTH, MAX_HEIGHT,32, 0, QImage::IgnoreEndian)) { for(y=0ysetMovie(movie)gif_lable->show()

哎 两星期前终于搞定了qt上显示摄像头视频采集, 现在来把最终重要的代码总结下

QImage img

unsigned char *bit= v4l _dev.buffer / //v41_dev.buffer为内存映射的地址

QRgb *point

int r, g, b

QPainter paint

if(img.create(MAX_WIDTH, MAX_HEIGHT,32, 0, QImage::IgnoreEndian))

{

for(y=0y<MAX_HEIGHTy++)

{

for(x=0x<MAX_WIDTHx++)

{

r=(int)bit[i+2]

g=(int)bit[i+1]

b=(int)bit[i]

point= (QRgb *)(img).scanLine(y)+ x

*point = qRgb(r,g,b) //qRgb函数能够将数据转为RGB三像素值

i+=3

}

}

}

但是不是很明白,希望有人能把这个直接写成 QT GUI APPLICATION PROJECT 然后我再参考下。。。因为对于QT的类库真的不太了解,呵呵

Qt Creator支持中文,启动速度比Eclipse、Netbeans更快,界面也更美观,跟输入法Fcitx协作良好(光标跟随)。 你既可以把Qt Creator当代码编辑器作为vim辅助,好处在于Qt Creator能够自动parse项目,形成友好快速的智能提示,而且你也同样可以使用Qt Creator里面的gdb前端(上图)和valgrind前端(高清大图) 对项目进行调试和内存分析,不过Makefile就要自己写或者用autotools生成了,这对于使用vim进行编程的同学来说,应该是轻车熟路的。差点忘了,连续按两次Alt+V快捷键即可进入VIM编辑模式(FakeVim),这应该很能吸引vim用户。当然,Qt Creator默认支持主流版本控制系统git/hg/svn等。 你也可以把Qt Creator当作IDE,这时可以作为Eclipse CDT、 Netbeans for C++这些重量级IDE的一个轻量替代品。你可以直接在Qt Creator的向导里新建一个非Qt使用CMake自动构建的项目,这意味着你不用自己写Makefile,你只要在Qt Creator里“执行CMake”就能自动生成。当然,你也可以导入一个make构建的项目到Qt Creator里编译调试,比如Nginx。 1、安装Qt Creator和基础构建环境(以Ubuntu为例): 安装基础系统构建工具包: 代码如下: sudo apt-get -y install build-essential cmake valgrind 下载最新版二进制Qt Creator(建议使用基于Qt4构建的2/qtproject/official_releases/qtcreator/2.8/2.8.1/ 不进行GUI编程,不需要安装Qt SDK,也就没有qmake和相关Qt开发库,只用下载那个60M的Qt Creator就好了,比如我下的是: 代码如下: qt-creator-linux-x86_64-opensource-2.8.1.run 下载后给予执行权限,运行选择安装目录安装即可,可以安装在自己的家目录。 项目配置默认存放位置~/.config/QtProject 可以通过参数-settingspath自定义配置文件存放位置,比如: 代码如下: /home/eechen/qtcreator-2.8.1/bin/qtcreator -settingspath /home/eechen/qtcreator-2.8.1 注意:如果你用的是基于Qt5构建的Qt Creator 3系列,其默认集成了iBus输入法插件,而对于Fcitx插件,则需要手动安装包fcitx-frontend-qt5, 然后复制libfcitxplatforminputcontextplugin.so到Qt Creator 3的 bin/plugins/platforminputcontexts 目录,比如: sudo apt-get install fcitx-frontend-qt5 ln -s /usr/lib/`arch`-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so /png/dev/qtcreator-3.2.1/bin/plugins/platforminputcontexts/ 重启QtCreator,就可以正常使用Fcitx输入法了. 2、把自动完成快捷键"Ctrl+空格"改为"Alt+/"或者"Shift+Return"(Return表示Enter键) 工具-选项-环境-键盘: 键盘快捷键输入"Ctrl+空格",在键位顺序中点击x删除原来的"Ctrl+空格",输入新的"Alt+/",确定退出. 3、在Qt Creator中使用make构建,运行,调试通用C/C++项目 文件-新建文件或项目-导入项目-导入现有项目 这样导入的项目用的是make构建,需要自己写好Makefile文件后才能构建,支持自动完成,支持调试和内存分析. 4、在Qt Creator中使用cmake构建,运行,调试通用C/C++项目 文件-新建文件或项目-非Qt项目:新建一个CMake项目 在"执行CMake"这一步的参数中填入-DCMAKE_BUILD_TYPE=Debug 这样才可以在Qt Creator中调试程序,-DCMAKE_BUILD_TYPE的值可以设为Debug或者Release或者RelWithDebInfo. cmake可以自动生成Makefile方便用make构建项目,但使用cmake构建项目也必须要会编写CMakeLists.txt文件. Qt Creator支持使用qmake,make,cmake构建项目,但不能直接往cmake项目里添加文件,Qt Creator对CMake的支持还有待改进. 临时的做法是,切换到文件管理器来添加文件,然后右击项目"执行CMake"使parsing(语法解析)生效,并载入文件到在项目. 5、Qt Creator会自动识别系统中安装的gcc、g++、gdb、make、cmake、valgrind,也可以自己到菜单"工具"->"选项"里进行一些自定义配置. 配置vim外部编辑器: 工具->选项->环境->外部工具->使用vi进行编辑 把xterm改为konsole或者gnome-terminal 参数改为-e vim "%{CurrentDocument:FilePath}" 配置终端: 工具->选项->环境->概要 KDE环境默认为 代码如下: /usr/bin/konsole -e 如果要用gnome-terminal,则设为/usr/bin/gnome-terminal -x 设置在终端运行程序: 项目(侧边栏)-运行-勾选"在终端中运行" 调试(gdb)时出现"ptrace operation not permitted"问题解决办法: 临时设置: 代码如下: sudo sysctl kernel.yama.ptrace_scope=0 永久设置: 编辑/etc/sysctl.d/10-ptrace.conf改为kernel.yama.ptrace_scope = 0 系统默认设为1的目的是为了安全,防止用户程序(比如这里的gdb)访问其他进程(比如这里的konsole,gnome-terminal)内存的数据.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/6098788.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-14
下一篇 2023-03-14

发表评论

登录后才能评论

评论列表(0条)

保存