上一篇:http://hi.baidu.com/%B3%BF%B3%D8/blog/item/59839a438d372b1573f05dfd.html

  一晃两年多过去了,第二步才开始,道个歉!

    先要做的是修正一下第一步里面一点错误,首先,最新的poco已经支持对express的Visual Studio 2008/2010了,这是一个好消息,这意味着在windows上面我们就有免费工具使用poco了。

  其次要做的,是一点补充,关于编译方面。需要说一下的是,用build_vs71.cmd(或者其他什么build_vs*.cmd)编译,其本质仍然是用Visual C++编译,只不过改成了命令行执行而已。以 build_vs71.cmd为例,打开以后,里面只有一行是buildwin …,然后,我们打开buildwin.cmd,在里面就很复杂的一大票东西——就是windows批处理脚本,但是只要注意一个变量%BUILD_TOOL%就可以了,在文件第一行定义的就有:

set BUILD_TOOL=devenv

devenv就是Visual C++执行命令行编译的命令。在整个文件前面很多if判断就是检查需要执行什么类型的编译(debug/release…),然后就开始用BUILD_TOOL进行编译。

  对于使用vcproj项目文件来编译poco就是一个Visual C++工程文件进行编译,但是它的几个选项,可能需要解释一下:debug_shared/release_shared,这个没什么说的,就是调试或者发布版本,使用的poco库是动态链接库;static_mt/static_md,这个的区别就有点费解,其中前面的debug/release_static很清楚,后面的mt/md区别在于对C/C++ runtime库的链接方式,mt表示用静态方式链接C/C++ runtime库,md表示用动态方式链接C/C++ runtime库,比如,debug_static_mt的意思是调试版本,使用静态poco库,链接C/C++ runtime库使用静态方式,其他亦然。

更多关于C/C++ runtime库的知识:

关于C/C++ runtime库编译选项设置的详细而权威的官方介绍:http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.71).aspx 

为什么和怎么选择正确的C/C++ runtime库:http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

  好了,这些东西知道就可以了,刚刚入门的时候就用debug_shared模式就可以了,等用的多了,再认真区别。

在程序当中使用poco库

  以VS2003.net的Windows Console工程为例,创建起来以后,需要修改下面这些配置,才可以开始在程序里面使用poco库的函数或者类:

  1、菜单Project - Properties,打开项目的Properties Pages窗体,在Configuration Properties - C/C++ - Code Generation当中的Runtime Library选项修改成为Muti-threaded DLL (MD)。这个选项默认的是单线程的,只要改成任意一个多线程选项就可以了,不做修改是无法编译通过的。

  2、菜单Project - Properties,打开项目的Properties Pages窗体,在Configuration Properties - C/C++ - General当中的Additional Include Directories当中,填写上poco的include文件夹。比如你的poco放在了c:\poco目录下面,那么你需要写上c:\poco\poco-1.4.0\Foundation\include。这个选项是设置引用的库对应头文件所在位置,编译器会把这个目录放在寻找头文件的目录候选当中。

  3、菜单Project - Properties,打开项目的Properties Pages窗体,在Configuration Properties - Linker - General当中的Additonal Library Directories当中,填写上poco的lib文件夹,如上条的例子,你应该写c:\poco\poco-1.4.0\lib。这个选项设置了库文件所在目录。

  4、菜单Project - Properties,打开项目的Properties Pages窗体,在Configuration Properties - Linker - Input当中的Additional Input Files当中,填写上你要调用的poco库文件。在这里我们要调用一个字符串处理函数,它在库PocoFoundation.lib当中,所以就填这个就可以了。

  5、把PocoFoundation.lib对应的dll文件复制到项目文件夹,它在poco的bin目录下面,名字就是PocoFoundation.dll。这是因为我们编译用的是debug shared模式,可执行代码里面并没有poco的二进制码,在需要调用poco函数的时候,它就会按照一定的候选目录顺序去对应的dll里面找,项目文件夹是第一个候选目录,所以我们把对应的dll放在这里。

当然,做这一切的前提是:你已经成功的编译了poco的debug shared版本。

  下面,把这些代码输入到main.cpp(你的工程里应该只有这一个文件)当中:

#include "Poco/String.h"

#include <string>

#incude <iostream>
int main(int argc, char** argv)
{
std::string s0("          Hello, world!        ");
std::string s1 = Poco::trim::trim(s0));
std::cout << s0 << std::endl;
std::cout << s1 << std::endl;
return 0;
}

  在这个程序里面,我们调用了一个poco的函数trim,它的功能就是把字符串两端的空格去除掉,然后我们输出去除以前和以后的字符串看看效果。编译通过以后,执行程序,就完成了(应该很顺利,如果你按照上述步骤还遇到问题了,请跟帖)。对于poco当中的单个函数,也可以采用类似的方式进行调用。

一点解释:

  1、Poco/String.h是包含了trim的头文件,关于函数trim的更多详细说明,或者更多类似trim函数的说明,请参考poco的文档:http://pocoproject.org/docs/

  2、如果你下载了poco的官方文档,里面也有关于trim的例子,也很简单,但是有一点区别就是官方文档的代码没有#include ,这个是因为在头文件Poco/String.h里面通过其他抓出poco头文件引用过了,所以不添加也可以(我原来不知道这一点)。个人以为加上好点,清楚。

  3、Poco::trim::trim函数就在头文件Poco/String.h当中,是用模板定义的。本来只要引用了头文件就可以用,不需要一二三四五的设置一大堆,但是由于间接引用了其他头文件(Poco/Foundation.h),不得不如此。有点可惜,如果能做到只引用头文件就可以使用函数就好了,杀鸡杀牛一样方便灵活,但是现在的做法是杀鸡不得不用牛刀。

  4、在前面第二条设置头文件路径的时候,必须设置到include,不能是inlcude/Poco;相同原因,我们引用的时候,必须是Poco/String.h,而不能是String.h。因为在poco内部的头文件互相引用的时候就是基于目录include而不是include/Poco的。

  5、注意大小写不要搞错,即使是include里面也不能错,因为并不是所有的操作系统都不区分大小写字母的。如果大小写混淆了,会牺牲poco的可移植性(这本来就是poco的一个很大的优点)。

  到这里,我们已经可以在工程当中使用一个简单的poco函数,虽然例子是VS2003.net的Console工程,但是对于其他版本的vs下的其他工程,也是类似的配置方法。下一步,我会介绍一下poco的各个功能和优点,解释一下为什么要用poco。

[原文在百度空间已经关闭]