zoukankan      html  css  js  c++  java
  • CPPCMS库在Windows下的使用

    标题:CPPCMS库在Windows下的使用
    时间:2012-7
    作者:Kagula

    环境:
    [1]WinXP SP3
    [2]VisualStudio2008 SP1
    [3]ZLib 1.2.7
    [4]PCRE 8.31
    [5]Python 2.7.3

    第一步:配置编译环境
    ZLib库
    [1-1]进行VS2008命令行模式(若无特殊说明,全部命令均在这种模式下运行)
    [1-2]zlib库 1.2.7下载并解压到e:sdk
    [1-3]进入到E:SDKzlib-1.2.7win32目录下面,执行下面的命令,生成INSTALL.vcproj文件
    cmake .. -G"Visual Studio 9 2008"
    不跟参考调用cmake命令会打印出使用帮忙。
    [1-4]
    使用VS2008打开ALL_BUILD.vcproj文件编译出现unistd.h文件末尾错误,在文件最后加入一个回车换行再编译就可以了。
    缺省编译选项是MinSizeRel(对生成的文件大小进行优化&发行版 编译模式)。
    在E:SDKzlib-1.2.7win32MinSizeRel文件夹下为生成对应的lib和dll文件,还有测试用的exe文件。

    PCRE库
    [2-1]在下面的网址
    ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.31.zip
    下载并解压PCRE源码包到"E:SDKpcre-8.31"路径下
    [2-2]运行下面命令生成ALL_BUILD。vcproj文件,双击打开,并在VS2008中BUILD!
    E:SDKpcre-8.31>cmake -G"Visual Studio 9 2008"
    [2-3]如果在“MinSizeRel”下编译
    会自动建立E:SDKpcre-8.31MinSizeRel目录,并在这个目录里生成DLL、LIB、EXE等文件

    Python
    [3]在Win下安装Python2.7.3
    我是装在C:Python27路径下的,把这个路径添加到Path环境变量中

    ICU(多国语言支持,可选)
    [4]在下面的地址
    http://download.icu-project.org/files/icu4c/49.1.2/icu4c-49_1_2-Win32-msvc10.zip
    下载并解压缩到E:SDK目录
    悲剧,只支持Visual Studio 2010。

    OpenSSL1.0.1(可选)
    [5]如何下载编译这个库,参考网上相关文档,这里懒的写了。

    第二步:编译CPPCMS
    [1]
    E:SDKpcre-8.31;E:SDKzlib-1.2.7

    [2]进入E:SDKcppcms-1.0.1目录下,运行下面的命令
    E:SDKpcre-8.31>cmake -G"Visual Studio 9 2008"
    -DCMAKE_INCLUDE_PATH=E:SDKpcre-8.31;E:SDKzlib-1.2.7 
    -DCMAKE_LIBRARY_PATH=E:SDKpcre-8.31MinSizeRel;E:SDKzlib-1.2.7win32MinSizeRel

    注意,上面是为了阅读方便才把一行内容break成三行的,实际输入命令还是在一行里。
    [3]
    生成ALL_BUILD.vcproj,双击打开。"MinSizeRel"方式编译(即生成最小文件的Release版本)
    编译booster工程时,需要[Configuration Properties]->[C/C++]->[Preprocessor]->[Preprocessor Definitions]中添加
    “PCRE_STATIC”宏,否则pcre_free函数的实现会找不到,参考资料[1]。
    编译cppcms工程前,修改zlib.h文件,把原“#include "zconf.h"”代码段改为“#include "win32zconf.h"”代码段。
    然后编译Solution里全部的工程通过。

    如果你修改了CPPCMS依赖库的头文件和库文件位置,则用cmake命令重新生成vcproj文件,再编译。
    这样要比你一个个手动更改编译选项要方便多了。

    第三步:我的第一个CPPCMS程序
    [1]
    在VS2008中配置以下项目
    配置头文件路径
    E:SDKcppcms-1.0.1
    E:SDKcppcms-1.0.1ooster

    配置依赖库文件路径
    ----------------------------------------------
    Release版本的
    E:SDKcppcms-1.0.1MinSizeRel
    ----------------------------------------------
    Debug版本的(默认)
    E:SDKcppcms-1.0.1Debug
    ----------------------------------------------

    [2]在VS2008里新建C++的Win32 Console项目
    链接库依赖项中加入“cppcms.lib”

    [3]参考资料[2]中代码新建下面的代码

    [cpp] view plain copy
     
    1. #include <cppcms/json.h>    
    2. #include <iostream>  
    3.   
    4. using namespace std;  
    5.     class response {  
    6.     public:   
    7.         //0 is ok  
    8.         //other values are wrong  
    9.         int status;  
    10.         string message;  
    11.     };  
    12.       
    13. namespace cppcms {  
    14.     namespace json {  
    15.         template<>  
    16.         struct traits<response> {  
    17.             static void set(value &v, response const& in) {  
    18.                 v.set("status", in.status);  
    19.                 v.set("message", in.message);  
    20.             }  
    21.         };  
    22.     }  
    23. }    
    24.   
    25. int main(int argc, char** argv) {  
    26.     response r1;  
    27.     r1.status=0;  
    28.     r1.message="ok";  
    29.     cout<< cppcms::json::value(r1)<<endl;  
    30.   
    31.     response r2;  
    32.     r2.status=1;  
    33.     r2.message="failed";  
    34.     cout<< cppcms::json::value(r2)<<endl;  
    35.       
    36.     return 0;  
    37. }  

    [4]
    把下面路径中的文件复制到当前项目路径中
    ----------------------------------------------
    MiniSizeRel版本的
    E:SDKcppcms-1.0.1oosterMinSizeRelooster.dll
    E:SDKzlib-1.2.7win32MinSizeRelzlib.dll
    E:SDKcppcms-1.0.1MinSizeRelcppcms.dll
    ----------------------------------------------
    Debug版本的(默认)
    E:SDKzlib-1.2.7win32Debugzlibd.dll
    E:SDKcppcms-1.0.1oosterDebugoost.dll
    E:SDKcppcms-1.0.1Debugcppcms.dll
    ----------------------------------------------

    [5]参考资料[2]的代码建立项目并在Release下可以正常运行。
    但是在Debug模式下,虽然能编译,但不能正常运行。
    一般我们为了调试方便,会在DEBUG方式下运行程序,所以你还必须编译出各个第三方库的DEBUG版本。

    [6]默认情况下cppcms第三方库进行Debug同Release版本之间的切换不方便
    [6-1]修改booster库的Debug编译选项
    [Configuration Properties]->[Linker]->[General]->[Output File]->[原booster.dll改为boosterd.dll]
    [Configuration Properties]->[Linker]->[Advanced]->[Import Library]->[原booster.lib改为boosterd.lib]

    [6-2]修改cppcms项目的Debug编译选项
    [Configuration Properties]->[Linker]->[Input]->[Additional Dependencies]->[原booster.lib改为boosterd.lib]
    [原E:SDKzlib-1.2.7win32MinSizeRelzlib.lib改为E:SDKzlib-1.2.7win32Debugzlibd.lib]
    [原E:SDKpcre-8.31MinSizeRelpcre.lib改为E:SDKpcre-8.31MinSizeRelpcred.lib]
    [Configuration Properties]->[Linker]->[General]->[Output File]->[cppcmsd.dll]
    [Configuration Properties]->[Linker]->[Advanced]->[Import Library]->[cppcmsd.lib]
    ----------------------------------------------------------------------------------------
    这样就可以把DEBUG方式的LIB路径加入到VS2008中,而不会和原来的路径冲突。
    把DEBUG方式的DLL文件复制到当前项目文件夹也不会把Release方式的DLL覆盖,方便了开发。
    ----------------------------------------------------------------------------------------
    后来发现,Debug版本的DLL要放到上一级(Solution级别)的Debug目录中才能被EXE(Debug模式)找到,
    但是Release版本的DLL文件只要放到当前项目.vcproj文件所在的目录就可以了,不纠结了... ..。
    现在Debug模式设置依赖库为cppcmsd.lib就可以正常跑参考资料[2]中的代码。

    [7]参考cppcms项目自带的json例子,进行深入学习。


    参考资料
    [1]PCRE_free找不到的问题
    http://forums.codeblocks.org/index.php?topic=9577.0
    [2]《C++序列化和反序列化》
    http://www.cnblogs.com/fengye-dream/archive/2012/03/21/2409964.html
    [3]《cppcms官网》
    http://cppcms.com/wikipp/en/page/main

  • 相关阅读:
    【LeetCode OJ】Remove Element
    【LeetCode OJ】Remove Duplicates from Sorted Array
    【LeetCode OJ】Swap Nodes in Pairs
    【LeetCode OJ】Merge Two Sorted Lists
    【LeetCode OJ】Remove Nth Node From End of List
    【LeetCode OJ】Two Sum
    【LeetCode OJ】Majority Element
    最长公共子序列问题
    php fopen与file_get_contents的区别
    PHP 技巧集合
  • 原文地址:https://www.cnblogs.com/lidabo/p/7150788.html
Copyright © 2011-2022 走看看