人脸识别相关软件及库

opencv
libface
eViacam: 用脑袋来移动鼠标

Qt库商用问题

Nokia收购Trolltech后,将其Qt 4.5版本及以后版本开发库开源协议转换为LGPL,这个协议对Qt商用限制很宽松,在不修改Qt库源代码的基础上,允许开发中使用Qt开发库,允许调用Qt发布的动态库,允许商用程序发布时一起发布未经过修改的Qt动态库。

另外,自己编译的Qt动态库(不修改代码)应该也可以随商用程序一起发布吧。有一个商业程序XWin的,Qt的动态库文件名就不是在qt 网站下载的默认的名字,也是可以发布的。
静态编译qt库进程序中是否可以呢。

介绍两个Qt相关的项目

一个是纯Qt写的imap邮件客户端,Trojita
另一个是纯Qt写的SMTP客户端库,QwwSmtpClient

如果需要实现相关的功能模块,可以作为参考。

另两个xmlrpc库
libmaia, 代码有点老了,使用的QHttp已经标记为Obsolete了。
qtxmlrpc, 看了下代码,使用一些比较新的qt类,2010年初发布的最后一版本。

从Qt MainMenuBar上移除一个主菜单

在Qt中有一套非常完整的菜单系统,通过QMainWindow::menuBar()调用可以获得主菜单,这些主菜单上有一些一级菜单,如果希望移除其中某几个,可以使用两种方法,一种是暂时的隐藏,另一种是永久删除。
Qt中向主菜单添加新的一级菜单的时候,会返回一个QAction, 可以使用这个QAction 操作菜单,如
this->ui.testMenu->menuAction()->setVisible(false);
这样程序运行的时候这个testMenu一级菜单隐藏,这样还可以在某些特定时刻需要的时候再显示出来。

另一种使用delete obj;语句,如 delete this->ui.testMenu;
这样移除的菜单对象永久消失。
如果testMenu是使用Qt Designer创建的,那么出现一个问题,在做程序动态语言locale切换的时候,程序会因为这个操作而崩溃,即使delete语句后使用this->ui.testMenu = NULL;也没有用。

如果需要动态调整某些菜单的显示,则使用第一种方法,
如果这个菜单的确用不着了,那么不要用Qt Designer创建菜单,而是手编码创建菜单,手工加入到菜单栏,合适的时候删除这个菜单,不会导致程序出问题。

nullfxp 2.0.2 released

自上次发版已经半年多了,忙些俗事,终于有时间做了些更新,发个版本,该项目依然在进步。
freebsd版本暂时没有打包,现在没有装好平台,以后补上,如有需要,可直接联系。

改进的地方主要有:
* 修正本地目录重命名问题。
* 更新安装文档。
* 改进FTP协议动态字符编码转换功能。
* 修正特大端口号造成程序运行失常的问题。
* 新加SFTP文件数据续传功能。
* 改进递归删除提示,自动区分目录及文件。
* 修正递归删除时只能删除第一个目录/文件的问题。
* 修正上传时达到服务器磁盘Quota限制检测问题, 现在可以正确检测。
* 新加任务队列Sqlite数据库存储支持。
* 新加windows 7 x64位支持。
* 修正Mac OS X XCode 3.x 编译问题。
* libbssh2升级到1.2.5 bug修正版本.

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

in

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

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

测试网站列表:
非凡软件下载
sina下载 down.tech.sina.com.cn
www.greendown.cn
...
如果您测试了其他站点,请email我。

补丁如下:
aria2-1.9.2_redirect_no_cookie_no_refer.patch

diff --git a/src/HttpRequest.cc b/src/HttpRequest.cc
index c6c0afb..dfc981f 100644
--- a/src/HttpRequest.cc
+++ b/src/HttpRequest.cc
@@ -218,9 +218,10 @@ std::string HttpRequest::createRequest()
     builtinHds.push_back(std::make_pair("Referer:", getPreviousURI()));
   }
   if(!_cookieStorage.isNull()) {
+      std::string baseDomain = util::getBaseDomainName(getHost());
     std::string cookiesValue;
     std::vector<Cookie> cookies =
-      _cookieStorage->criteriaFind(getHost(),
+        _cookieStorage->criteriaFind(baseDomain, // getHost(),
                                    getDir(),
                                    Time().getTime(),
                                    getProtocol() == Request::PROTO_HTTPS ?
@@ -235,15 +236,25 @@ std::string HttpRequest::createRequest()
   }
   for(std::vector<std::pair<std::string, std::string> >::const_iterator i =
         builtinHds.begin(), eoi = builtinHds.end(); i != eoi; ++i) {
-    std::vector<std::string>::const_iterator j = _headers.begin();
-    std::vector<std::string>::const_iterator jend = _headers.end();
+    // std::vector<std::string>::const_iterator j = _headers.begin();
+    // std::vector<std::string>::const_iterator jend = _headers.end();
+    std::vector<std::string>::iterator j = _headers.begin();
+    std::vector<std::string>::iterator jend = _headers.end();
     for(; j != jend; ++j) {
       if(util::startsWith(*j, (*i).first)) {
         break;
       }
     }
+    // hacked by liuguangzhao@users.sf.net
+    // if user header is not cookie, override it, or leave it there no touched.
+    // for this case, the best methord is combine to cookies part to one Cookie: header line
     if(j == jend) {
       strappend(requestLine, (*i).first, " ", (*i).second, A2STR::CRLF);
+    } else {
+        // combine the new cookie to header line
+        if (util::startsWith((*i).first, "Cookie") && !util::endsWith(*j, (*i).second)) {
+            (*j) += ";" + (*i).second;
+        }
     }
   }
   // append additional headers given by user.
diff --git a/src/HttpResponse.cc b/src/HttpResponse.cc
index 6957fe9..79de4bd 100644
--- a/src/HttpResponse.cc
+++ b/src/HttpResponse.cc
@@ -116,11 +116,13 @@ std::string HttpResponse::determinFilename() const
 
 void HttpResponse::retrieveCookie()
 {
+    // hacked by liuguangzhao@users.sf.net
+    std::string baseDomain = util::getBaseDomainName(httpRequest->getHost());
   std::vector<std::string> v = httpHeader->get(HttpHeader::SET_COOKIE);
   for(std::vector<std::string>::const_iterator itr = v.begin(), eoi = v.end();
       itr != eoi; ++itr) {
     httpRequest->getCookieStorage()->parseAndStore(*itr,
-                                                   httpRequest->getHost(),
+                                                   baseDomain, // httpRequest->getHost(),
                                                    httpRequest->getDir());
   }
 }
diff --git a/src/Request.cc b/src/Request.cc
index 9fbba5a..4204c0a 100644
--- a/src/Request.cc
+++ b/src/Request.cc
@@ -125,7 +125,8 @@ void Request::setReferer(const std::string& uri)
 }
 
 bool Request::redirectUri(const std::string& uri) {
-  _previousUri = A2STR::NIL;
+    // _previousUri = A2STR::NIL;
+    _previousUri = _uri;  // hacked by liuguangzhao@users.sf.net
   _supportsPersistentConnection = true;
   ++_redirectCount;
   std::string redirectedUri;
diff --git a/src/util.cc b/src/util.cc
index 58a37d4..bb10bdc 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -1305,6 +1305,48 @@ void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group)
   }
 }
 
+// hacked by liuguangzhao@users.sf.net
+/*
+  only leave the last 2 or three domain parts
+ */
+    std::string getBaseDomainName(const std::string &s)
+    {
+        std::string baseDomain;
+        std::string ts = s;
+        if (util::isNumericHost(s)) {
+            return s;
+        }
+        size_t colonPos = ts.find(':');
+        if (colonPos != std::string::npos) {
+            ts.resize(colonPos);
+        }
+
+        std::vector<std::string> domParts;
+        std::string delims(".");
+        util::split(ts, std::back_inserter(domParts), delims);
+        
+        int minDomParts = 2;
+        int domLevel = domParts.size();
+        if (domParts.at(domLevel - 1) == "cn"
+            || domParts.at(domLevel - 1) == "cc"
+            || domParts.at(domLevel - 1) == "us") {
+            if (domParts.at(domLevel - 2) == "org"
+                || domParts.at(domLevel - 2) == "com"
+                || domParts.at(domLevel - 2) == "net"
+                || domParts.at(domLevel - 2) == "info") {
+                minDomParts = 3;
+            }
+        }
+
+        baseDomain = domParts.at(domLevel - 2) + "." + domParts.at(domLevel - 1);
+        if (minDomParts == 3) {
+            baseDomain = domParts.at(domLevel - 3) + "." + baseDomain;
+        }
+
+        return baseDomain;
+    }
+
+
 } // namespace util
 
 } // namespace aria2
diff --git a/src/util.h b/src/util.h
index 9e1c2a5..01b6a1c 100644
--- a/src/util.h
+++ b/src/util.h
@@ -395,6 +395,9 @@ bool inSameCidrBlock(const std::string& ip1, const std::string& ip2, int bits);
 
 void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group);
 
+    // hacked by liuguangzhao@users.sf.net
+    std::string getBaseDomainName(const std::string &s);
+
 } // namespace util
 
 } // namespace aria2

karia2下载管理器开发进展及功能摘要

在加入karia2后,对karia2进行大规模的升级,使用原来nullget的UI部分相关代码及控制类,加入aria2c 后端控制代码,与之通信控制的代码等。

目前实现的功能,
多任务同时下载的管理功能,
任务暂停及恢复续传功能,
任务分类功能,
BT下载文件选择功能,
BT下载peers端显示功能,
Opera浏览器关联菜单功能,
IE浏览器关联菜单功能,
Firefor通过flashgot插件进行关联下载功能,
自动监测并使用浏览器中的cookie功能,
实时速度控制功能。
Opera浏览器中可下载 163.com邮箱中的附件,163.com网盘中的文件. 其他邮箱暂时没试.

以上功能都能在不同平台上使用,没有任何平台障碍,目前测试的平台有window xp, windows 7, 主要linux桌面发行版,包括YLMF Linus OS, Mac OS X Snow Leopard 10.6.x。

karia2 作为一个开源绿色下载软件,在windows上尽量不向系统注册表写入大量信息,目前只写入了关于IE下载菜单关联的一项2个值。与其他浏览器的关联都是通过浏览器相关的功能实现,不向系统写入垃圾信息。当然这么做会限制软件可实现的某些功能,影响软件使用的方便性,易用性,不过会不断完善。

项目进展总体已经到了alpha中期,后面再实现一些选项处理功能进入beta测试阶段。

如果您了解linux平台的程序编译,现在就可以检出karia2 svn代码,并编译试用。
如果您在使用时遇到什么问题,可以email我。
如果您有什么意见或建议,可以email我。
如果您是开发人员,想参与进来,我将非常高What I need is an high level abstracted system similar to Adobe's Flash which allowes to easily create custom widgets and place them in an animated scene.
Does QT allow to do this?兴,欢迎您加入,请email我。
如果您觉得软件很有价值,并希望支持它,让它越来越完善,fell free donate to me。

features in mind:
基于P2P的资源共享,只共享链接资源,不共享下载的数据资源。
远程aria2c下载后端支持功能。

预览:

实现了一个简单的opera浏览器cookie文件解析库libo4f

库的名字叫opera 4 file formats library, 现在只能读取,不支持写入功能。
测试opera版本 opera 10.52 for unix。
适用于读取Opera7+的 cookies4.dat, vlink4.dat, dcache4.url三个配置文件。

参考文档:

1. 官方文档,(现在官方网站已经找不到了,存储在本地)
http://www.qtchina.net/?q=node/428

2. 在另一个网站找到的一篇说明文档,虽然描述的没官方文档详细,但关键的几个文件格式中的值说明的比较清楚。
http://www.qtchina.net/?q=node/429

结合这两篇文档,在解析cookies4.dat的时候基本没有问题,只有一个0x28编号的tag识别不出来,但可以忽略这个值,不影响解析其他的数据。

源代码: http://nullget.svn.sourceforge.net/viewvc/nullget/vendor/libo4f/
下载最新snapshot包: http://nullget.svn.sourceforge.net/viewvc/nullget/vendor/libo4f.tar.gz?v...

该库提供的API:

 libo4f_t *libo4f_open(const char *path);
int libo4f_close(libo4f_t *o4f);
int libo4f_file_type(libo4f_t *o4f);
cookie_t *libo4f_get_cookie(libo4f_t *o4f, const char *name, const char *domain);
// format is opera's alert(document.cookie): 
// PREF=ID=f9557c2a82e32ccb:U=34b1f389b91cd77d:FF=2:NW=1:TM=1270620463:LM=1270651259:S=-OagB_stpJtDuZa8
char *libo4f_get_cookie_string(libo4f_t *o4f, const char *domain);

自己动手制作VC++2010绿色版

绿色版本需求:不需要安装即可使用,干净不带IDE,不带其他语言C#、F#开发工具,不带SqlServer相关开发工具,不带.NET4 SDK,
整个包较原版安装包小,支持编译调试版本的程序,支持x86、x64、以及x86交叉编译x64应用程序。

制作环境:
Windows 7 ultimate中文版本。
VS2010安装在默认的C:\Program Files (x86)\Microsoft Visual Studio 10.0\目录。
绿化环境在Z:\VC2010\目录。

1. 到MicroSoft官方网站下载 MicroSoft Visual Studio 2010 retail 30天试用版本,安装时选择只安装VC++工具,
包括x64开发包,但不包括IA64开发包。
测试运行无误,准备完毕。这原版VC++2010战用磁盘5.5G左右。

2. 创建VC++2010绿色版基础目录结构。
Z:\VC2010\bin\
Z:\VC2010\lib\
Z:\VC2010\include\
Z:\VC2010\atlmfc\
Z:\VC2010\crt\
Z:\VC2010\PlatformSDK\
Z:\VC2010\redist\
Z:\VC2010\system32
Z:\VC2010\SysWOW64\
Z:\VC2010\ide\
Z:\VC2010\scripts\

3. 拷贝VC++2010基本包文件
注:下面的说明把C:\Program Files (x86)\Microsoft Visual Studio 10.0\简写为CPMS,
把C:\Program Files (x86)\ 简写为CPF86。
把CPMS\目录下的altmfc, include,bin,lib,crt,redist目录拷贝到Z:\VC2010\。
把CPF86\Microsoft SDKs\Windows\v7.0A\目录下的include,lib拷贝到Z:\VC2010\PlatformSDK\。
把CPF86\Microsoft SDKs\Windows\v7.0A\bin\目录下的mt.exe, mt.exe.config, rc.exe, rcdll.dll 四个文件拷贝到Z:\VC2010\PlatformSDK\。

4. 拷贝VC++2010中用到的附加库及程序
把C:\Windows\SysWOW64\msvcr100_clr0400.dll 拷贝到Z:\VC2010\SysWOW64\。
把C:\Windows\System32\msvcr100_clr0400.dll 拷贝到Z:\VC2010\system32\。
这两个文件是编译过程中COFF文件格式转换工具cvtres.exe使用的,x86,x64两个平台下使用两个不同的版本。

把CPMS\Common7\IDE\目录下的 msobj100.dll, mspdb100.dll, mspdbcore.dll, mspdbsrv.exe, mspdbst.dll 五个文件拷贝到Z:\VC2010\ide\。
这几个文件是编译调试版本的程序或者库时乃至的程序。

5. 编写VC++运行环境变量脚本。
一共有4个要编写的脚本,分别为,
Z:\VC2010\vc2010.bat 运行环境启动入口脚本。
Z:\VC2010\scripts\vcvars32.bat x86运行环境相关变量设置脚本。
Z:\VC2010\scripts\amd64\vcvars64.bat x64运行环境相关变量设置脚本。
Z:\VC2010\scripts\x86_amd64\vcvarsx86_amd64.bat 在x86平台上交叉编译x64程序或者库运行环境相关变量设置脚本。

这四个脚本都有参考脚本,可在原版安装目录中找到。

a) Z:\VC2010\vc2010.bat
主要是注册绿色版VC2010的安装目录,然后根据不同的参数确定不同的运行平台,调用下面对应平台上的环境设置脚本。

set VCINSTALLDIR=Z:\VC2010
 
@echo off
if "%1" == "" goto x86
if not "%2" == "" goto usage
 
if /i %1 == x86       goto x86
if /i %1 == amd64     goto amd64
if /i %1 == x64       goto amd64
if /i %1 == ia64      goto ia64
if /i %1 == x86_amd64 goto x86_amd64
if /i %1 == x86_ia64  goto x86_ia64
goto usage
 
:x86
if not exist "%VCINSTALLDIR%\scripts\vcvars32.bat" goto missing
call "%VCINSTALLDIR%\scripts\vcvars32.bat"
goto :eof
 
:amd64
if not exist "%VCINSTALLDIR%\scripts\\amd64\vcvars64.bat" goto missing
call "%VCINSTALLDIR%\scripts\\amd64\vcvars64.bat"
goto :eof
 
:ia64
if not exist "%VCINSTALLDIR%\scripts\ia64\vcvars64.bat" goto missing
call "%VCINSTALLDIR%\scripts\ia64\vcvars64.bat"
goto :eof
 
:x86_amd64
if not exist "%VCINSTALLDIR%\scripts\x86_amd64\vcvarsx86_amd64.bat" goto missing
call "%VCINSTALLDIR%\scripts\x86_amd64\vcvarsx86_amd64.bat"
goto :eof
 
:x86_ia64
if not exist "%VCINSTALLDIR%\scripts\x86_ia64\vcvarsx86_ia64.bat" goto missing
call "%VCINSTALLDIR%\scripts\x86_ia64\vcvarsx86_ia64.bat"
goto :eof
 
:usage
echo Error in script usage. The correct usage is:
echo     %0 [option]
echo where [option] is: x86 ^| ia64 ^| amd64 ^| x86_amd64 ^| x86_ia64
echo:
echo For example:
echo     %0 x86_ia64
goto :eof
 
:missing
echo The specified configuration type is missing.  The tools for the
echo configuration might not be installed.
goto :eof
 
:eof

b) Z:\VC2010\scripts\vcvars32.bat

@if "%VCINSTALLDIR%"=="" goto error_no_VCINSTALLDIR
 
@echo Setting environment for using Microsoft Visual Studio 2010 x86 tools.
 
@set PATH=%VCINSTALLDIR%\BIN;%VCINSTALLDIR%\PlatformSDK\bin;%PATH%
@set PATH=%VCINSTALLDIR%\redist\x86\Microsoft.VC100.CRT\;%VCINSTALLDIR%\SysWOW64;%PATH%
@set PATH=%VCINSTALLDIR%\redist\Debug_NonRedist\x86\Microsoft.VC100.DebugCRT;%VCINSTALLDIR%\ide;%PATH%
@set INCLUDE=%VCINSTALLDIR%\ATLMFC\INCLUDE;%VCINSTALLDIR%\INCLUDE;%VCINSTALLDIR%\PlatformSDK\include;%INCLUDE%
@set LIB=%VCINSTALLDIR%\ATLMFC\LIB;%VCINSTALLDIR%\LIB;%VCINSTALLDIR%\PlatformSDK\lib;%LIB%
@set LIBPATH=%VCINSTALLDIR%\ATLMFC\LIB
 
@goto end
 
 
:error_no_VCINSTALLDIR
@echo ERROR: VCINSTALLDIR variable is not set. 
@goto end
 
:end

c) Z:\VC2010\scripts\amd64\vcvars64.bat

@if "%VCINSTALLDIR%"=="" goto error_no_VCINSTALLDIR
 
@echo Setting environment for using Microsoft Visual Studio 2010 x64 tools.
 
@set PATH=%VCINSTALLDIR%\BIN\amd64;%VCINSTALLDIR%\PlatformSDK\bin\win64\amd64;%VCINSTALLDIR%\PlatformSDK\bin;%VCINSTALLDIR%\BIN;%PATH%
@set PATH=%VCINSTALLDIR%\redist\x64\Microsoft.VC100.CRT\;%VCINSTALLDIR%\System32;%PATH%
@set PATH=%VCINSTALLDIR%\redist\Debug_NonRedist\x64\Microsoft.VC100.DebugCRT;%VCINSTALLDIR%\ide;%PATH%
@set INCLUDE=%VCINSTALLDIR%\ATLMFC\INCLUDE;%VCINSTALLDIR%\INCLUDE;%VCINSTALLDIR%\PlatformSDK\include;%INCLUDE%
@set LIB=%VCINSTALLDIR%\ATLMFC\LIB\amd64;%VCINSTALLDIR%\LIB\amd64;%VCINSTALLDIR%\PlatformSDK\lib\x64;%LIB%
 
@set LIBPATH=%VCINSTALLDIR%\ATLMFC\LIB\amd64;%LIBPATH%
 
@goto end
 
:error_no_VCINSTALLDIR
@echo ERROR: VCINSTALLDIR variable is not set. 
@goto end
 
:end

d) Z:\VC2010\scripts\x86_amd64\vcvarsx86_amd64.bat

@if "%VCINSTALLDIR%"=="" goto error_no_VCINSTALLDIR
 
@echo Setting environment for using Microsoft Visual Studio 2010 x64 cross tools.
 
@set PATH=%VCINSTALLDIR%\BIN\x86_amd64;%VCINSTALLDIR%\BIN;%VCINSTALLDIR%\PlatformSDK\bin;%PATH%
@set PATH=%VCINSTALLDIR%\redist\x86\Microsoft.VC100.CRT\;%VCINSTALLDIR%\SysWOW64;%PATH%
@set PATH=%VCINSTALLDIR%\redist\Debug_NonRedist\x86\Microsoft.VC100.DebugCRT;%VCINSTALLDIR%\ide;%PATH%
@set INCLUDE=%VCINSTALLDIR%\ATLMFC\INCLUDE;%VCINSTALLDIR%\INCLUDE;%VCINSTALLDIR%\PlatformSDK\include;%INCLUDE%
@set LIB=%VCINSTALLDIR%\ATLMFC\LIB\amd64;%VCINSTALLDIR%\LIB\amd64;%VCINSTALLDIR%\PlatformSDK\lib\amd64;%LIB%
 
@set LIBPATH=%VCINSTALLDIR%\ATLMFC\LIB\amd64;%LIBPATH%
 
@goto end
 
:error_no_VCINSTALLDIR
@echo ERROR: VCINSTALLDIR variable is not set. 
@goto end
 
:end

6. 创建启动快捷方式。
一共有3个,分别为:
VC++2010_x86.lnk
VC++2010_x64.lnk
VC++2010_x86-amd64.lnk

i) VC2010_x86.lnk 属性设置
设置目标:%comspec% /k ""Z:\VC2010\vc2010.bat"" x86
起始位置:Z:\VC2010

ii) VC2010_x64.lnk 属性设置
设置目标:%comspec% /k ""Z:\VC2010\vc2010.bat"" amd64
起始位置:Z:\VC2010

iii) VC2010_x86-amd64.lnk 属性设置
设置目标:%comspec% /k ""Z:\VC2010\vc2010.bat"" x86_amd64
起始位置:Z:\VC2010

需要注意的是,这几个快捷方式的字体属性指定为NSimsun,不要使用点阵字体,否则在其他语言版本的系统上有问题。

现在需要使用不同环境的VC++2010只需要点击相应的启动快捷方式就可以进入对应环境的编译命令行了。

附后:
如果需要设置自定义的一些环境变量,可以修改vc2010.bat入口脚本头几行,设置可生效。

来仔细看看GCC 4.5.0

in

距离GCC 4.4的发布一年之久,GNU终于发布GCC 4.5了。新版本带来了很多新特性,包括使用MPC库在编译时完成复杂的算术计算,C++0x支持增强,使用部分Graphite完成自动并行化,支持新的ARM处理器,Intel Atom优化和调优支持,以及AMD Orochi优化支持等。今年稍晚发布的Fedora 14,Ubuntu 10.10,OpenSUSE 11.3,都将有GCC4.5,估计Gentoo马上就会有支持了,磨拳擦掌准备试用喽:)详细支持如下:

总体说明:

  • 编译GCC需要MPC库
  • 故纸堆里的旧系统和很久没有更新和测试的系统在GCC4.5中被标记为待放弃,包括IRIX, Solaris 7, Tru64 UNIX V5.1.
  • GCC4.4中标记为待放弃的支持被放弃
  • 移除Itanium 1变种支持,但Itanium2编译的程序能在Itanium1上正确执行
  • GCC生成的调试信息包括了更多DWARF 3的特性,甚至包含了DWARF4的一些特性.GDB7.0之前的版本将无法使用这些特性.所以调试GCC4.5编译的程序需要使用GDB7.0及以上版本.也可以使用选项 -gdwarf-s -gstrict-dwarf来禁止生成DWARF4信息,或者-gdwarf-2 -gstrict-dwarf让GCC严格执行DWARF2标准.
  • X86上,浮点运算在GCC4.5上使用严格C99语法编译时,可能会运行变慢。这是为了和标准一致,可以通过选项-fexcess-precision=fast来避免严格的标准限制。
  • noinline属性不再能阻止整个函数拷贝。但可以通过新的属性noclone做到。

改进:

  • -save-temps可以增加参数,该功能让用户可以在并行编译的时候得到编译器的中间文件,但不会在不同的文件夹中使用相同的文件名从而干扰比起。
  • 调试信息目标文件也都被放在了同个文件夹下,而不是当前工作目录,这样用户可以在并行编译的时候得到调试信息。
  • 集成了MPC库,这样可以让GCC在编译时更精确的评估复杂的算术运算。GCC也可以通过它,对于常数作参数的数学运算类内建函数调用,直接在编译时使用相等的返回值来代替之。包括下列内建函数:cacos, cacosh, casin, casinh, catan, catanh, ccos, ccosh, cexp, clog, cpow, csin, csinh, csqrt, ctan和ctanh。
  • 新的链接时优化器(-flto),打开此选项后,GCC会针对每个输入文件,产生bytecode的表示形式,并将其写入每个目标文件的特定ELF区內。链接时,从这些ELF区內读取函数体,并将其实体化为转换单元。这样就可以使得过程间优化能在不同的文件间进行(甚至不同语言间),进而可能提升性能。使用此功能需要在编译时和链接时都增加-flto选项。如果不需要程序输出任何符号,可以联合-fwhopr和-fwhole-program来让过程间优化器执行更加激进的优化。
  • 增强自动并行化,现在支持外层循环的并行化。
  • 自动并行化能作为Graphite的一部分来打开。在选项-ftree-parallelize-loops=的基础上增加-floop-parallelize-all能打开基于Graphite的优化。(注:Graphite是GCC中使用多面体模型做循环优化的部分)
  • 重写基于严格指针的优化架构,会提高生成代码的效率。基于严格指针的优化在打开-fno-strict-aliasing后可用。
  • 增加关于函数传参的新优化。试图改变函数原型,避免无用传递,仅传递结构体中特定部分,并将引用传参改为值传参。-O2,-Os及以上级别默认开启此优化。
  • 优化异常控制代码。

新语言支持和特定语言改进

  • 所有语言:-fshow-colum选项默认打开,错误信息现在有列信息。
  • C类语言:若#include的文件未找到,编译器会立即退出;增加一个新内建函数__builtin_unreachable();增加-Wlogical-op选项,对可能存在的逻辑错误,报警告;嵌入式汇编增加goto特性,允许汇编中的语句直接跳到C中的标号处;C++0x原始strings(raw string)支持;deprecatd树形现在可以增加可选字符串参数,如__attribute__((deprecated(“text string”))),这样,deprecation警告会和字符串一同打印。
  • 其他针对各个语言的详细细节请参考官方release。

其他改进:

  • 插件支持:可以不通过改变编译器代码来扩展编译器功能。-fplugin=file.so能指定GCC载入动态链接文件file.so,并将其作为编译器的一部分执行。更多的细节请参考相关文档。
  • 安装文件夹稍有变动。

参考:

http://gcc.gnu.org/gcc-4.5/changes.html

PS:GCC 4.5.0最大的更新是性能提升,对于高性能的benchmark,普遍性能提升在5%-10%. GCC4.5.0中真正实现了过程间优化。过程间优化能明显的提升性能并明显降低生成的代码大小。另外,GCC4.5.0也使用多面体模型改进了循环优化架构.使得GCC日后可以加入更多高级循环优化,并且能深入调优。

Syndicate content