Libevent库静态编译方法

1. 首先通过configure设置关闭动态编译,打开静态编译
./configure –disable-shared –enable-static

可以比较默认编译选项和做如上设置的编译后的文件大小比较,
sample目录下,静态编译的可执行文件使用strip后,http-server 为140kb,动态库方式的为20kb左右.

2. 在链接时要添加 -lrt 这个库,否则会提示缺少函数符号clock_gettime
gcc testev.c -I../libevent/include/ -levent -L ../libevent/lib/ -lrt

Popularity: 8% [?]

Random Posts

体验Delphi XE4 iOS 开发时真机调试环境下碰到的一些问题解决方法

最新的Delphi XE4支持了iOS原生开发,凑着热闹也试了一下,发现很多传统Delphi界面开发的模式在iOS开发这儿都得到了延续,如创建窗体,拖拉控件,对控件的事件做处理等。可以通过它快速实现使用标准界面的应用。

初步感受之开发iOS程序的不足之处:

  1. 编译出来的文件比较大
  2. 一个简单的应用都快20MB的大小了,虽说现在手机的内存比较大了,但是也不能这么样吧,这还没算运行时需要的运行内存都这么大了,实际运行起来需要多少内存呢?

  3. 对用的最多的基本String行为做了修改
  4. 只支持Unicode的字符串,AnsiString不支持了,而且居然从0开始下标了,让熟悉了传统Delphi字符串以1为下标的人情以何堪啊

回到正题,真机调试过程中碰到的一些问题以及解决方法:

  1. 设置好Proile后,编译时在codesign时出现 [PAClient Error] Error: E0264 ambiguous错误
  2. 按照官方解释,只能有一个名称好用,当有冲突且错误提示中Matchs名称不一样的时候可以删除掉一个,或者修改名称唯一。但是还有一个问题其实就是这台开发电脑使用了好久,有之前的过期证书未被删除,这儿也是显示冲突的,需要在Mac证书助理中显示已过期的证书(默认不显示已过期的证书,你的感觉会同名的只有一个),然后将过期的证书删除,保证同名的只有一个即可正常通过codesign

  3. 执行文件时候出现 Unable to install package. (e8008015) 错误。
  4. 这个问题有人在EMB提问过,结果官方一句未能重新问题就打发了,对EMB鄙视。实际情况是做测试的机器的udid未在证书签名中,加入设备的udid后后重新签名证书,问题消失。

  5. 写的程序需要外部资源,未能在打包发布中带过去
  6. 这个问题需要在菜单的Deployment将需要的资源添加进去即可(要注意添加的目录和程序中的读取对应起来),在这儿再次鄙视EMB,居然没有资源的目录结构,且不能批量目录增加资源文件,需要手工逐个文件添加,对那些使用大量资源的人估计就惨了,在不同目录下拥有同名资源的人就更惨了。

Popularity: 8% [?]

Random Posts

TMS的MEMO控件(TAdvMemo/TTMSFMXMemo) 中文处理修订补丁

在Delphi下试用了TMS的TAdvMemo 和 TTMSFMXMemo 文本高亮显示,发现它们对中文的支持有缺陷(有中文的行中文显示不正常,光标定位不准等),于是乎分析跟踪了一下源码,对其做了中文处理的补丁。
为了修正对中文的处理,必须要对如下几个函数做补丁:
CharFromPos
CellFromPos
CellRect
PaintLine
修订后,中文显示正常,光标移动定位正常,鼠标点击选择正常

Popularity: 8% [?]

Random Posts

给VS2010添加对所有工程都起作用的默认INCLUDE包含路径

在WIN机器上安装了BOOST库,每次用VS2010新建使用BOOST库的工程时都要手工在工程文件中修改INCLUDE路径,烦,而VS2010去掉了以往在tools->option中设置全局默认INCLUDE路径的地方,网上找了一下,发现
这里有答案

http://stackoverflow.com/questions/3349378/edit-includepath-macro-in-visual-studio-2010

修改文件
C:\Documents and Settings\用户名\Local Settings\Application Data\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props

WIN7下对应文件

C:\Users\用户名\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props

在这里面添加了BOOST库的INCLUCE目录后,每个新建的工程中就默认有BOOST的INCLUCE路径了

Popularity: 8% [?]

Random Posts

TIdHTTP访问从HTTP重定向到HTTPS页面出错问题的解决

使用TIdHttp 访问http协议的网页,碰到返回的页面自动重定向到https协议的地址,然后报不能创建SSL连接的错误。

网上搜索后发现只要在TidHttp对象创建后,再创建一个TIdSSLIOHandlerSocketOpenSSL 对象,将TIdHttp对象的IOHandler值设置为新创建的TIdSSLIOHandlerSocketOpenSSL对象,再次编译运行,问题就可以解决。可以自动获取跳转到https协议地址的网页内容。

Popularity: 7% [?]

Related

使用MySQL Connector C++的PreparedStatement更新数据碰到类型异常

使用MySQL Connector C++ 的preparedStatement,在更新数据时,碰到异常

  1.  pstmt = con->prepareStatement("INSERT INTO logs(day, time, uid, vid, cid, cv, did, res) VALUES (?,?, ?,?, ?,?, ?,?)");
  2.  pstmt->setInt(1, day);
  3.  pstmt->setInt(2, time);
  4.             //…..
  5.         pstmt->setInt(8, res);
  6.  
  7.  pstmt->executeUpdate();

执行executeUpdate时碰到异常: Using unsupported buffer type: 0 (parameter: 1)

不知道怎么回事,使用google搜索了一会,没有找到解决方法。
没有办法,将相关代码替换使用Statement的execute方法处理,执行ok

Popularity: 7% [?]

Related

一个C++编译的问题折腾了我好久

被一个C++编译的问题折腾了好久,
在程序源码中修改了一下基类.h文件函数的声明方式,而没有改动对应的cpp源码文件,结果编译链接的时候还是使用上次cpp编译的结果,导致虽然编译过程没有错误提示出来,但是链接出的代码行为不正常。

为了发现这个问题还反复复查子类的代码和debug,浪费了很多不必要的时间,以后一定要养成修改了代码后make clean的习惯,虽然这样再次编译的时候比较费时间,但是至少能够保障编译出的是自己修改后希望的结果,而不会由于忘记某事某步骤得到不一样的结果而让费大量时间去做无用功调试。

Popularity: 6% [?]

Random Posts

使用fastcgi++编写fastcgi应用初探(一)

fastcgi++作为一个完全C++编写的fastcgi应用开发包,封装了很多功能,比如参数提取,session,mysql数据库连接管理等最大限度的简化cgi编程。
编写一个简单的helloworld的fastcgi应用。

  1. #include <fstream>
  2. #include <boost/date_time/posix_time/posix_time.hpp>
  3.  
  4. #include <fastcgi++/request.hpp>
  5. #include <fastcgi++/manager.hpp>
  6.  
  7. void error_log(const char* msg)
  8. {
  9.         using namespace std;
  10.         using namespace boost;
  11.         static ofstream error;
  12.         if(!error.is_open())
  13.         {
  14.                 error.open("/tmp/errlog", ios_base::out | ios_base::app);
  15.                 error.imbue(locale(error.getloc(), new posix_time::time_facet()));
  16.         }
  17.  
  18.         error << '[' << posix_time::second_clock::local_time() << "] " << msg << endl;
  19. }
  20.  
  21. class Helloworld: public Fastcgipp::Request<char> {
  22. public:
  23.         bool response()
  24.         {
  25.                 out << "<html><body>";
  26.                 out << "Hello world!";
  27.                 out << "</body></html>";
  28.                 return true;
  29.         }  
  30. }
  31. main(){
  32.         try
  33.         {
  34.                 Fastcgipp::Manager<Helloworld> fcgi;
  35.                 fcgi.handler();
  36.         }
  37.         catch(std::exception& e)
  38.         {
  39.                 error_log(e.what());
  40.         }
  41. }

可以看到基本的只要从 Fastcgipp::Request 派生一个类,实现其中的 bool response() 函数就可以完成一个fastcgi 应用。

Popularity: 7% [?]

Related

Delphi6总是提示要注册激活问题解决

好一段时间没有用 Delphi6了,今天在打开一个工程的时候竟然反复提示要注册。

就算是用Kg提供的SN与激活方法都失败了,激活步骤总是先提示注册成功,然后再提示注册失败,郁闷。。。

后来网上找到一篇:
找到注册表:
[HKEY_CURRENT_USER\Software\Borland\Delphi\6.0]

删除下面的 “LM” 键

照做后,再打开 Delphi6,果然全好了,继续使用Delphi6中…

Popularity: 6% [?]

Related

ASQLite控件的Blob类型字段内存泄漏问题

使用Delphi的ASqlite控件做Sqlite数据库的数据维护,最近打开一个大的表,总是报”out of memory while expading memory stream” 的错误,提示内存不足。

经分析,是由于ASqlite控件在默认情况下总是将数据装入内存,记录数太多时造成数据不能完整装入。经查有UniDirectional数据可是设置为单方向使用表,可以不将记录完整装入到内存。但是设置了该属性值为True后,遍历表仍然是”Out of memory while expanding memory stream” 错误,感觉没有起作用。

分析ASQlite的源码,发现其将memo类型数据当作blob类型处理,而在UniDirectional为True是,读取记录时创建的BlobStream没有释放,因此和UniDirectional为False时行为一样。

修正Bug,打开ASGSqlite3.pas,将

  1. function TASQLite3BaseQuery.GetRecord(Buffer: PAnsiChar;    GetMode: TGetMode;
  2.   DoCheck: boolean): TGetResult;

函数的末尾部分

  1.     if Result = grOK then
  2.     begin
  3.       if FUniDir then begin
  4.           ptr := Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams,self);
  5.           if ptr <> nil then begin
  6.              Move(ptr^, ActiveBuffer^, MaxStrLen);
  7.           end else Result := grEOF;
  8.       end else begin
  9.           ptr := FResult.GetData(FCurRec);
  10.           if FResult.Count = 0 then
  11.              InternalInitRecord(Buffer)
  12.           else
  13.              if ptr <> nil then Move(ptr^, Buffer^, MaxStrLen); // albert 17/11/2004
  14.       end;
  15.       …

修改为

  1.     if Result = grOK then
  2.     begin
  3.       if FUniDir then begin
  4.           // 增加部分,释放前一记录的blobstream内存
  5.           if FResult.Count > 0 then begin FResult.FreeBlobs; FResult.Delete(0); end;
  6.          
  7.           ptr := Connection.SQLite3_GetNextResult(Connection.DBHandle, FStatement, FParams,self);
  8.           if ptr <> nil then begin
  9.              FResult.Add(ptr, 0);  // 增加部分,当前行添加到缓存中,等待下次释放
  10.              Move(ptr^, ActiveBuffer^, MaxStrLen);
  11.           end else Result := grEOF;
  12.       end else begin
  13.           ptr := FResult.GetData(FCurRec);
  14.           if FResult.Count = 0 then
  15.              InternalInitRecord(Buffer)
  16.           else
  17.              if ptr <> nil then Move(ptr^, Buffer^, MaxStrLen); // albert 17/11/2004
  18.       end;
  19.      …

修改后编译程序,再次打开库文件遍历表,没有再次出现问题。

Popularity: 6% [?]

Related

← Previous PageNext Page →