Jump to Navigation

C++

C/C++编程

原来qt的qmake已经能使用pkgconfig功能了

还没确定从哪版本开始支持的,我现在用的qt 4.7.1是已经支持了的,好像是在4.7.0版本加入的这个功能。

使用方法,

CONFIG += link_pkgconfig # enable the PKGCONFIG feature
PKGCONFIG += glib-2.0 # link against glib-2.0

另外,还可检没某个包是否存在,

packagesExist(glib-2.0) {
DEFINES += HAS_GLIB
PKGCONFIG += glib-2.0
}

// and in the code:
#ifdef HAS_GLIB
// use glib here
#endif

这样使用pkgconfig的功能,已经非常简便了
还有一点疑问,这个在非linux系统上,如mac, win上是什么表现呢。

使用select+blocked socketpair模拟新版本内核才支持的nonblock socketpair

话说服务器系统太老真是不爽,现在使用大多数服务器系统都是debian5,而这个系统的内核版本2.6.26,glibc 2.7,一些很方便的函数像pipe2, nonblock socketpair恰好从内核2.6.27开始支持,需要用到这个功能,又不能不兼容这要部署的服务器版本,真郁闷。
现在要实现一个线程间的非阻塞通信,本来在使用的桌面系统上找到pipe2,从man手册上看完全符合使用要求,没想到在服务器上先测试了一下,直接没有这个函数,查了一下手册,这个原来从glibc 2.9加入的。
后面又找到了socketpair函数,这个也非常方便,这回还先看了一下服务器,有这个函数,可谁知系统又没有定义一个叫SOCK_NONBLOCK的宏,无法使用它的nonblock模式。

苦苦思索一番,找到一种解决办法,完整的方法是,
使用#ifdef编译指令,加select block模式的socketpair,这样即能在新系统上使用,也可在比较旧的系统上运行。

大概步骤如下,

首先使用socketpair创建一对已经连接的socket,

我的第一个kde4程序

在使用bespin中的xbar kde4 plasma applet的时候,遇到一个自定义菜单的功能,希望在菜单中有一功能,能最小化所有的窗口,能恢复所有窗口功能。
没有找到现成的工具或者方法,所以写了一个简单的使用kde4基础库的小工具来实现这一功能。另外这个小程序还有一个功能,可根据程序名字把其窗口提到最上层,展示给用户,这功能用于使用dolphin显示某些固定文件夹,如在已经开启的dolphin中显示文档目录,并把dolphin拉到最上层。

刚开始写kde4的程序,只用了kde4基础库的三个类,代码:

Category:

在windows上使用msvc2010编译64位的libcurl

下载最新包,在lib/下有Makefile.vc10, 使用指令

cd lib

nmake /f Makefile.vc10 CFG=release

可编译出相应格式的库

其中编译64位要对该Makefile.vc10进行修改,指定MACHINE为x64, 修改相关的zlib及ssl库的路径。

Taxonomy upgrade extras:

关系数据库开发共享库 HailDB

HailDB 是一个用来嵌入 InnoDB 数据存储引擎的开发共享库,提供非常棒、高质量和可靠的 InnoDB 数据库引擎的集成。你可以用它来开发数据库。

HailDB 刚刚发布了 2.0 版本(2010-8-3),详情请看这里

授权协议: GPLv2
开发语言: C/C++
操作系统: Mac OS UNIX BSD Linux

Category:

LLVM,Clang编译工具键项目介绍

llvm, LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种语言编译器的后台来使用。
clang, Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。
libc++, 如同每个C++编译器套装都自带一份对应的C++标准库一样,clang 在可使用GNU libstdc++作为标准库之后,开始了自己的C++标准库编写项目,这就是libc++。
libc++以C++0x 为目标,同样以BSD风格的llvm许可证发布,其特性及目标除了“编译/执行速度快”和“占用内存小”之外,还可在如异常对象、 RTTI(Runtime Type Identification 运行时类型识别)和内存分配等低级特性上与GCC的libstdc++保持 ABI兼容性。
lldb, 基于LLVM的 debugger新一代高性能调试器,集成LLVM反编译器和Clang表达式解析器等高阶组件,用于C/C++ /Objective-C 程序的调试,同样以LLVM许可证发布。

Category:

nullfxp原生64位windows 7支持的问题

现在64位硬件非常普遍,操作系统对64位硬件的支持也不断改进。现在的64位windows7已经运行的相当稳定,兼容性也不错。这种情况下,64位系统是现在的趋势,所以考虑nullfxp原生支持64位操作系统,而不是32位应用程序运行在64位操作系统上。

现在的情况是,编译的32位nullfxp既能运行于32位操作系统,又可运行于64位系统,并且运行状态良好,没有什么差别。但是,编译的64位nullfxp却无法在64位系统上正常运行,程序崩溃比较频繁,所有功能几乎无法使用。
在linux系统,32位和64位系统上都运行良好。

为了能让64位编译的nullfxp正常运行于64位操作系统中,需要对现有的代码做些修改,目前出问题的地方还没有找到,这个移植的工作量还未知,需要进一步深入的测试,找到问题所在才能确定,甚至有可能重写整个程序。现在代码量粗略统计已经超过3万行,重写的工作量相当大。

专门为windows 64位版本的nullfxp创建新的分支,在这再找一问题出在什么地方。

A1, 今天在测试中发现,即使Qt自带的一些示例,使用64位编译,运行时也会出现崩溃的问题。这么说qt 在64位windows上运行也有些问题,现在在windows 64位上使用64位qt还不成熟。

Taxonomy upgrade extras:

nullfxp 新功能:文件管理器导航栏

最近有时间,为nullfxp添加了许多新功能,界面上的上主要改变是,添加一个与文件管理器类似的管理功能,如地址栏,前进,后退,向上导航按钮。
另一个是目录视图模式设置功能,可以修改目录视图的大小,适应不同环境应用。

技术总结,为显示不同视图模式,使用Qt中的MVC架构,不同视图模式下共享model数据,共享QSelectionModel相关知识。

nullfxp最新界面抓图,

Taxonomy upgrade extras:

在Qt4中使用QPersistentModelIndex传递QModelIndex

在Qt4的model/view架构中,用的非常多的是QModelIndex,但这个类是动态的,可以说不可以传递的,因为随着view的变化,相同结点的QModelIndex也可能不同,非常容易失效,甚至造成读写数据错误的问题。
Qt4中还提供一个QPersistentModelIndex类,说明中这个类可以存储作为结点记录,并且不会因为model的变化而变化,应该也可以当作参数传递。
测试其中nullfxp中试用是否可以。

假如在一个View中的点击事件,点击之后异步更新当前点击的结点,
那么就需要在更新返回的时候正确查找到这个结点。
如果把这个结点的普通QModelIndex传递给异步更新处理器,则返回的时候程序行为 无法预料,
因为model中其他数据可能发生变化,而这个QModelIndex已经失效了,找不到原来的结点,或者找到的结点根本就不是原来结点。

这时候借助QPersistentModelIndex实现该功能,把当前的QModelIndex转换为QPersistentModelIndex:
QPersistentModelINdex *persisIndex = new QPersistentModelIndex(index);

Taxonomy upgrade extras:

给aria2打了个补丁,支持国内多数下载网站防盗链链接下载

这个补丁的作用,修改重定向时对引用及cookie的处理,使其能正确下载国内多数下载网站的防盗链链接。

补丁修改的机制说明:
在30x重定向时,RFC的HTTP标准规定不能发送Cookie, 不能使用引用。但国内多数下载站点这两者都同时使用,而且设置Cookie的域名比较复杂,这些都被作为防盗链的手段广泛使用,使其只能在浏览器中下载,遵守标准的普通下载工具却无法正常下载这些链接。
针对这种情况,在aria2中修正机制,在记录cookie的时候对域名进行处理,只保留有二级域名, 在查找cookie的时候也只是使用二级域名进行查询。
在做redirect的时候,仍旧按照服务器的响应记录cookie, 并在redirect请求中使用这些cookie。
在做redirect的时候,使用本次地址作为引用发送给服务器。
用户在--header参数中传递的Cookie会与本次服务器设置的Cookie合并,一起用于下一次转向链接的请求。

Taxonomy upgrade extras:

页面

订阅 RSS - C++


Main menu 2

by Dr. Radut