给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: 12% [?]

Random Posts

使用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: 10% [?]

Related

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

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

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

Popularity: 10% [?]

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: 10% [?]

Related

编译安装fastcgi++库

从fastcgipp官方网站下载最新的fastcgi++-2.0alpha-81f89e4e.tar.bz2,

  1. tar -xjvf fastcgi++-2.0alpha-81f89e4e.tar.bz2
  2. cd fastcgi++-2.0alpha-81f89e4e
  3. ./configure
  4. ./make
  5. ./make install

该fastcgi++库完全使用c++编写,依赖boost库(要求>1.35),所以安装时需要先安装boost库。
编译过程中碰到问题 mysql_set_character_set 找不到问题,修改 src/mysql.cpp 文件,将如下两行注释掉

  1.         //if(mysql_set_character_set(&connection, charset))
  2.         //      throw Error(&connection);

再次编译通过。
安装后include头文件被拷贝到 /usr/local/include/fastcgi++/,库文件被拷贝到 /usr/local/lib/fastcgipp.a

编译examples目录下测试用的fastcgi应用,验证编译安装的正常性。
使用默认的 make examples 没有编译通过。打开Makefile文件,发现缺少对 boost库的引用,将其添加上,再次编译,通过。

  1. FASTCGIPP_INCLUDE=/usr/local/include/fastcgi++
  2. BOOST_INCLUDE=/usr/local/include/boost-1_39
  3. BOOST_CPPFLAG=-I$(BOOST_INCLUDE) -pthread
  4. BOOST_THREADLIB=-lboost_thread-gcc34-mt-1_39 -pthread
  5.  
  6. pkgConfigLibs=-lfastcgipp -lboost_thread -lmysqlclient
  7. CXX=g++
  8. CXXFLAG= -g -O2
  9.  
  10. database.fcgi: database.cpp
  11.         $(CXX) -o database.fcgi database.cpp -I$(FASTCGIPP_INCLUDE) $(pkgConfigLibs) $(BOOST_CPPFLAGS) $
  12. (CXXFLAGS) $(BOOST_THREAD_LIBS)
  13.  
  14. clean:
  15.         rm -f *.fcgi

—————-
默认Makefile编译不通过的原因
1. 缺少对boost库的目录include引用
2. 缺少boost线程库的应用,默认使用的是-lboost_thread 需要为-lboost_thread-gcc34-mt-1_39 -pthread

Popularity: 9% [?]

Random Posts

编译安装BOOST库

从boost官方网站上下载最新的1.39版boost库。

  1. tar -xjvf boost_1_39_0.tar.bz2
  2. cd boost_1_39_0
  3. ./bootstrap.sh
  4. ./bjam -install

耐性等待编译安装,偶等了2个多小时。boost库的include头文件会被安装到 /usr/local/include/boost-1_39 下。库文件会被安装到 /usr/lib 目录下。

编译简单的测试程序。

  1. #include <boost/lexical_cast.hpp>
  2. #include <iostream>
  3. int main()
  4. {
  5.    using boost::lexical_cast;
  6.     int a = lexical_cast<int>("123456");
  7.     double b = lexical_cast<double>("123.456");
  8.     std::cout<<a<<std::endl;
  9.     std::cout<<b<<std::endl;
  10.     return 0;
  11. }

编写一个简单的Makefile文件

  1. BOOST_INCLUDE=/usr/local/include/boost-1.39
  2. BOOST_ROOT=/usr/local/src/boost_1_39_0
  3. BOOST_LIB=/usr/local/lib
  4.  
  5. CXX=g++
  6.  
  7. test: test.cpp
  8.         $(CXX) -o test test.cpp -I$(BOOST_INCLUDE)
  9. clean:
  10.         rm -rf test

进行编译

  1. make test

执行test程序可以看到输出结果.

123456
123.456

boost库安装确认通过。
————–
编译时可能需要导入的一些库引用

  1. #使用regex
  2. -lboost_regex-gcc
  3. #使用thread
  4. -lboost_thread -pthread

Popularity: 9% [?]

Random Posts

stl中vector,list,deque的使用准则

在stl中提供了vector, list,deque几种可当作列表使用的数据结构,他们都是动态增长的,在这三者之中选择的准则主要是关注插入特性以及对元素的后续访问要求。

vector

表示一段连续的内存区域每个元素被顺序存储在这段内存中。对vector 的随机访问效率很高 。但是在任意位置而不是在vector 末尾插人元素则效率很低,因为它需要把待插入元素右边的每个元素都拷贝一遍。类似地删除任意一个而不是vector的最后一个元素效率同样很低,简而言之,删除非末尾元素效率比较低

deque

也表示一段连续的内存区域但是与vector 不同的是它支持高效地在其首部插入和删除元素它通过两级数组结构来实现一级表示实际的容器第二级指向容器的首和尾

list

表示非连续的内存区域并通过一对指向首尾元素的指针双向链接起来从而允许向前和向后两个方向进行遍历在list 的任意位置插入和删除元素的效率都很高指针必须被重新赋值但是不需要用拷贝元素来实现移动,另一方面它对随机访问的支持并不好访问一个元素需要遍历中间的元素另外每个元素还有两个指针的额外空间开销

对这几种容器类型选择的一些准则

如果我们需要随机访问一个容器则vector 要比list 好得多
如果我们已知要存储元素的个数则vector 又是一个比list 好的选择
如果我们需要的不只是在容器两端插入和删除元素则list 显然要比vector 好
除非我们需要在容器首部插入和删除元素否则vector 要比deque 好

这几个标准容器类和数据结构对应关系

vector => 数组、list => 链表、deque => 队列

实际上对于小的对象vector 在实践中比list效率更高

容量是指在容器下一次需要增长自己之前能够被加入到容器中的元素的总数容量只与
连续存储的容器相关例如vector deque 或string。 list 不要求容量capacity()操作

长度size 是指容器当前拥有元素的个数为了获得容器的当前长度我们调用它的size()操作

vector 的动态自我增长越频繁元素插入的开销就越大。一种解决方案是当vector 的开销变得非常大时把vector 转换成list 另一种经常使用的方案是通过指针间接存储复杂的类对象.reserve()操作允许程序员将容器的容量设置成一个显式指定的值,但通常会导致性能退化

Popularity: 9% [?]

Related

使用getpwnam来配合setuid限制运行程序的账号

编写的daemon程序通常是在开机的时候使用root账号开启,这样对系统的安全存在隐患,需要将程序像vsftp等一样,在启动daemon启动后以一个较低权限的账号来运行。
经过查找资料,发现有setuid 和 setgid 两个函数可以使用,不过这两个函数需要传入 数字的编号,不方便程序配置上的设置,再经查资料,发现有getpwnam和getgrnam函数可以用,这两个函数都是传入一个名称返回对应的结构体数据。

  1. #include <stdio.h>
  2. #include <pwd.h>
  3. #include <grp.h>
  4.  
  5. int main()
  6. {
  7.     struct passwd * pw;
  8.     char *username = "nobody";
  9.     pw = getpwnam(username);
  10.     if (!pw) {
  11.         printf("user %s is not exist\n", username);
  12.         return -1;
  13.     }
  14.    setuid(pw->pw_uid);
  15.  
  16.    char * groupname = "www";
  17.    struct group * grp = getgrnam(groupname);
  18.    if (!grp) {
  19.       printf("group %s is not exist\n", groupname);
  20.       return -1;
  21.    }
  22.    getgid(grp->gr_gid);
  23.  
  24.    // ….do things……
  25. }

passwd结构体的定义如下

  1. struct passwd {
  2.     char     * pw_name;        /* Username.        */
  3.     char     * pw_passwd;      /* Password.        */
  4.     __uid_t pw_uid;           /* User ID.         */
  5.     __gid_t pw_gid;           /* Group ID.        */
  6.     char     * pw_gecos;       /* Real name.       */
  7.     char     * pw_dir;         /* Home directory. -*/
  8.     char     * pw_shell;       /* Shell program.   */
  9. };

group结构体的定义如下

  1. struct group {
  2.     char     * gr_name;        /* Group Name.        */
  3.     __gid_t gr_gid;           /* Group ID.        */
  4.     char  **gr_mem;       /* Pointer to a null-terminated array of character
  5.                                        pointers to member names..       */
  6. }

Popularity: 8% [?]

Random Posts

WINCE不支持time函数?

WinCE上不支持time.h中的常用的time函数,网上找了一小段代码为其补上。

  1. time_t time( time_t *inTT ) {
  2.  SYSTEMTIME sysTimeStruct;
  3.  FILETIME fTime;
  4.  ULARGE_INTEGER int64time;
  5.  time_t locTT = 0;
  6.  
  7.  if ( inTT == NULL ) {
  8.    inTT = &locTT;
  9.  }
  10.  
  11.  GetSystemTime( &sysTimeStruct );
  12.  if ( SystemTimeToFileTime( &sysTimeStruct, &fTime ) ) {
  13.    memcpy( &int64time, &fTime, sizeof( FILETIME ) );
  14.    /* Subtract the value for 1970-01-01 00:00 (UTC) */
  15.    int64time.QuadPart -= 0x19db1ded53e8000;
  16.    /* Convert to seconds. */
  17.    int64time.QuadPart /= 10000000;
  18.    *inTT = int64time.QuadPart;
  19.  }
  20.  
  21.  return *inTT;
  22. }

更好的解决方案可以使用LuaCe中的实现(在luace.c文件中,和时间有关的几个函数实现都有)
—–
不过想不明白,这么基础的函数M$为什么不提供在SDK中。开发人员就一定是要用Systemtime函数?

Popularity: 7% [?]

Random Posts

如何在VC调试器中显示Symbian字符串(译)

在VC中编写Symbian程序,在调试状态下很不方便看Symbian的字符串内容,网络上搜到这么一篇,感觉不错,译载一下。
原文标题: How to display Symbian strings and descriptors in Visual C++ debugger
原文地址:http://www.newlc.com/How-to-display-Symbian-strings-and.html
译文地址: http://www.sunnyu.com/?p=135
本文由 sunny译于 2008.11.08 由于英文水平有限,译文难免有很多不足之处,欢迎指正。
————–译文开始—————-

目前,在使用Visual Studio调试Symbian程序时,Symbian的字符串显示方式有点不好,不能直接显示他们的内容(你只能使用Memory窗口查看)。在这儿,我们介绍一个小的技巧,使你在调试时能够方便的显示Symbian中字符串的内容。

我们是得益于Microsoft Visual Studio的”Auto Expand”特性做到这点的。这个特性允许我们指定调试器显示用户数据的方式。可以通过手工编辑AutoExp.dat文件来实现(文件默认在 C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin 目录下 )。

使用你惯用的编辑器打开这个文件,然后 拷贝/粘贴 下面的内容到文件尾部。

;=======================================================
;
; Symbian Strings & Descriptors
;
;=======================================================
TDes16=<,t> length=<iLength> max=<iMaxLength>
TDesC16=<,t> length=<iLength>
TPtr=length=<iLength> max=<iMaxLength> ptr=<iPtr+2,su>
TPtr16=length=<iLength> max=<iMaxLength> ptr=<iPtr+2,su>
TPtrC=length=<iLength> ptr=<iPtr,su>
TPtrC16=length=<iLength> ptr=<iPtr,su>
TBuf<*>=length=<iLength> max=<iMaxLength> buf=<iBuf,su>
TBufC<*>=length=<iLength> buffer=<iBuf,su>
HBufC16=length=<iLength> buffer=<iBuf,su>
TLitC<*>=length=<iTypeLength> buf=<iBuf,su>

TDes8=<,t> length=<iLength> max=<iMaxLength>
TDesC8=<,t> length=<iLength>
TPtr8=length=<iLength> max=<iMaxLength> ptr=<iPtr,s>
TPtrC8=length=<iLength> ptr=<iPtr,s>
TBuf8<*>=length=<iLength> max=<iMaxLength> buffer=<iBuf,s>
TBufC8<*>=length=<iLength> buffer=<iBuf,s>
HBufC8=length=<iLength> buffer=<iBuf,su>
TLitC8<*>=length=<iTypeLength> buffer=<iBuf,s>

TFileName= <iBuf,su>
TFullName= <iBuf,su>

重新运行IDE环境, 设置一两个断点, 开始调试方式运行程序, 你在断点可以看到….

desc-display.png

怎么样 ?

——

以前都不知道M$的VS有这个特性,又学了一招。vs2005对应的文件在 C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger 目录下

Popularity: 7% [?]

Related

← Previous Page — Next Page →