colorful

zc qq:1337220912

 

Boost 1.46.1编译成VS2008版本

今天Boost.org上下载了Boost的最新版本1.46.1,然后编译成VS2008的可用版本,总耗时大概20分钟左右。步骤如下:

1. 至Boost.org上下载Window下的Boost最新版 http://sourceforge.net/projects/boost/files/boost/1.46.1/ PS: 我下载的后缀为.7z的压缩版本。

2. 解压至本地硬盘,我解压在D:/boost_1_46_1下。

3. 编译得到bjam.exe. 进入VS2008的Command Prompt,(一定要是这个,不能是cmd)转目录至D:/boost_1_46_1/tools/build/v2,然后执行批处理bootstrap.bat后,得到bjam.exe, 将其拷至Boost根目录下(即:D:/boost_1_46_1)

4. 利用bjam.exe编译得到Boost的lib文件。将VS2008的Command Prompt的执行目录转至D:/boost_1_46_1,然后输入:bjam --toolset=msvc-9.0 --build-type=complete stage 后开始编译,大概20分钟后,编译完成。生成的库文件位于D:/boost_1_46_1/stage/lib下。

5. 在VS2008中,设置include路径和lib路径后,即可使用Boost最新版。


注:如果第4步仅输入bjam或直接点击bjam.exe执行,则生成的库文件为VS2010的库文件(形如:boost_filesystem-vc100-mt-1_46_1.lib).



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

VS2008下直接安装使用Boost库1.46.1版本

分类: 1.1 C/C++ 2711人阅读 评论(10) 收藏 举报

      Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。 Boost由于其对跨平台的强调,对标准C++的强调,与编写平台无关。大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库。但Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。boost 在一些播放软件和音效中指增强,比如Bass Boost,低音增强。

1.下载最新版的BOOST库,当前最新版为1.46.1(2011-3-12发布),下载链接地址:http://sourceforge.net/projects/boost/files/boost/1.46.1/

2.解压到硬盘上,其目录构造为

boost_1_46_1/ ................................boost根目录 
   index.htm ..................... www.boost.org 网站首页 
   boost/ ..............................所有的Boost头文件 
   lib/ .................................预编译的二进制库 
   libs/ ......................库的Tests, .cpps, docs等等 
     index.html .............................库文档开始处 
     algorithm/ 
     any/ 
     array/ 
                     …more libraries… 
   status/ .........................Boost-wide test suite 
   tools/ ...........实用工具, e.g. bjam, quickbook, bcp 
   more/ .......................................一些文档 
   doc/ ...............................所有库文档的一部分 

3.打开根目录下的index.html,在上面的“Getting Started”有介绍怎么开始使用Boost的,大部分的Boost库只需要包含头文件即可,少部分需要编译链接。以下是必须编译的Boost库:
    * Boost.Filesystem
    * Boost.GraphParallel
    * Boost.IOStreams
    * Boost.MPI
    * Boost.ProgramOptions
    * Boost.Python
    * Boost.Regex
    * Boost.Serialization
    * Boost.Signals
    * Boost.System
    * Boost.Thread
    * Boost.Wave
另外,一些库可以是可选择编译的:
    * Boost.DateTime (只有当你需要使用它的to_string/from_string或者serialization features, or if you're targeting Visual C++ 6.x or Borland.
    * Boost.Graph (只有当你倾向解析 GraphViz 文件)
    * Boost.Math (the TR1 and C99 cmath functions)
    * Boost.Random (当你需要使用random_device的时候)
    * Boost.Test (can be used in “header-only” or “separately compiled” mode)
4.下面开始一个无需编译Boost,直接使用头文件的示例:
①打开Visual Studio 2008,新建Visual C++工程,基于Win32控制台程序,工程名为example,确定之后,在弹出的对话框中“应用程序设置”打钩上“控制台应用程序”和“空项目”,点“完成”;
②在“解决方案资源管理器”右击example工程,选择“属性”→“C/C++”→“常规”→“附加包含目录”,输入刚才解压Boost的目录,比如“F:/MyCode/BOOST/boost_1_46_1”,如下图所示:

③右击example工程下的“源文件”→“添加”→“新建项”→左边的“代码”→选中右边的“C++文件(.cpp)”,文件名为example,点“添加”,输入以下代码:

#include <boost/lambda/lambda.hpp> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 
 
int main() 

    using namespace boost::lambda; 
    typedef std::istream_iterator<int> in; 
 
    std::for_each( 
        in(std::cin), in(), std::cout << (_1 * 3) << " " ); 

④点击菜单栏上“生成”→“生成解决方案”,正常的话会编译通过,按F5可看结果,结果如下图所示:

这个example代码的功能是从标准输入中读取一系列整型,然后使用boost::lambda使之每个数乘以3,再把结果写进标准输出。


5.若是需要用到那些必须得编译链接的库,那么就得组建编译Boost库了。官方文档上介绍说可以使用安装版,或者自己编译源代码,特别介绍推荐在Microsoft Visual Studio开发环境下使用安装版,因为安装版可以直接下载,并且带有预编译好的库,节省自己编译源代码的麻烦。在这里,因为我使用的是Visual Studio 2008,故欲试试使用安装版。安装版是boostpro网站制作的,安装版不是跟官方的Boost同步的,会比较晚一些时间才会发布出来。当前最新版BoostPro 1.46.1 Installer (197K .exe),下载地址:http://www.boostpro.com/download/

5.1运行安装版,一路“I Agree”,注意会连接网络,必须放行。之后会弹出选择下载Boost C++库1.46.1的镜像地址,默认就好,继续“Next”,弹出选择默认的编译类型,在左侧选择“Visual C++ 9”,在右侧选择类型,我们一般所用到的运行库比较多使用多线程,可以在上面的example工程看属性,如下图所示:

为此,我们只需选择上面四个选项,再根据动态链接和静态链接需求进行选择,如下图所示:

接下去就是选择组件安装,没啥问题就默认了,下一步选择路径,接着就开始下载了,如下图所示:

因为是连接网络下载,所以得一段比较长的时间,下载完之后就会自动安装好,在设定的目录下就有个lib文件夹,里面就是编译好的库。
5.2现在让我们测试一下那些需要链接才能使用的库:
①打开上面建立的example工程,将其cpp文件代码改为如下:

#include <boost/regex.hpp> 
#include <iostream> 
#include <string> 
 
int main() 

    std::string line; 
    boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" ); 
 
    while (std::cin) 
    { 
        std::getline(std::cin, line); 
        boost::smatch matches; 
        if (boost::regex_match(line, matches, pat)) 
            std::cout << matches[2] << std::endl; 
    } 

此时,若是生成解决方案的话,就会提示 fatal error LNK1104: 无法打开文件“libboost_regex-vc90-mt-gd-1_46_1.lib”
②右键example解决方案,选择“属性”→“配置属性”→“链接器”→“附加库目录”,添加安装版下载好的lib库文件夹路径,如下图所示:

③在菜单栏“生成”下拉选择“生成解决方案”,无警告无错误通过。将下面文字保存成文本文档,文件名为jayne.txt,内容如下:

To: George Shmidlap 
From: Rita Marlowe 
Subject: Will Success Spoil Rock Hunter? 
--- 
See subject. 

然后保存到工程目录的Debug文件夹下。接着Win+R输入CMD进入控制台,cd 转到此Debug目录下,输入example < jayne.txt命令,如下图所示:

回车之后,文本文档里面Subject主题的内容就会被正则匹配出来,如下图所示:

也可以不进入CMD控制台,直接在example解决方案右键“属性”→“调试”→“命令参数”,输入< jayne.txt ,按“确定”,直接Ctrl+F5运行程序,结果如下图所示:


6.最后总结,Visual Studio环境的话可以直接下载安装版的,省去麻烦的编译过程,但是不带帮助文档,这点得自己再从官方网站下载了,目前有汉化Boost文档,还有一些不错的中文站点,列举如下:
boost文档汉化:http://code.google.com/p/boost-doc-zh/
在线汉化版文档:http://www.cppprog.com/boost_doc/

posted @ 2012-03-02 21:01 多彩人生 阅读(1794) | 评论 (0)编辑 收藏

补习 size_t

size_t是标准C库中定义的,应为unsigned int。
  数据类型"socklen_t"和int应该具有相同的长度。否则就会破坏 BSD套接字层的填充.POSIX开始的时候用的是size_t, Linus Torvalds(他希望有更多的人,但显然不是很多) 努力向他们解释使用size_t是完全错误的,因为在64位结构中 size_t和int的长度是不一样的,而这个参数(也就是accept函数的第三参数)的长度必须和int一致,因为这是BSD套接字接口标准.最终POSIX的那帮家伙找到了解决的办法,那就是创造了一个新的类型"socklen_t".Linux Torvalds说这是由于他们发现了自己的错误但又不好意思向大家伙儿承认,所以另外创造了一个新的数据类型 。
  在C++中,设计 size_t 就是为了适应多个平台的 。size_t的引入增强了程序在不同平台上的可移植性。size_t是针对系统定制的一种数据类型,一般是整型,因为C/C++标准只定义一最低的位数,而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定议这样的数据类型。一般这种类型都会定义到它具体占几位内存等。当然,有些是编译器或系统已经给定义好的。经测试发现,在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节的,这样利用该类型可以增强程序的可移植性。
  一个基本的无符号整数的C / C + +类型。 它是sizeof操作符返回的结果类型。 该类型的大小是选择,因此,它可以存储在理论上是可能的任何类型的数组的最大大小。 在32位系统为size_t将采取32位和64位 - 64位。 换句话说,一个指针可以被安全地放进为size_t类型(一个例外是类的函数指针,但是这是一个特殊的情况下)。 为size_t类型通常用于循环,数组索引,大小的存储和地址运算。 虽然为size_t可以存储一个指针,它是更好地使用另一个unsinged整数类型uintptr_t形式,目的(它的名字反映了它的能力)。 在某些情况下,使用为size_t类型是更有效,比使用更无符号类型的程序员习惯性安全。
  size_t是一个无符号整数memsize基地型的C / C + +语言的标准库中定义的。 此类型在C头文件stddef.h,在文件cstddef中所述的C + +。 位于头文件stddef.h中定义的类型在全局命名空间,而cstddef地方在命名空间std为size_t类型。 由于C语言的标准头文件stddef.h纳入的兼容性的目的,在这些方案中,您可以在全局命名空间的类型的C + +程序(:为size_t,为size_t)和命名空间std(STD::为size_t)。

============================
主要是为了可移植用的
typedef unsigned long size_t;
typedef short pid_t;
在其他平台上有可能是 typedef unsigned int/long long size_t,         typedef long/int pid_t等等,,
这样就可以直接用size_t pid_t定义变量了,
解释以下pid_t的用法:
主要用在linux c下进程管理中的,用它来表示进程的id类型,即表示进程表的索引(进程表里是进程id类型)

posted @ 2012-03-01 20:38 多彩人生 阅读(477) | 评论 (0)编辑 收藏

Lua closure upvalue (转)

function是和数值、字符串同等地位的基本类型!

  Lua中的函数是一阶类型值(first-class value),定义函数就象创建普通类型值一样(只不过函数类型值的数据主要是一条条指令而已),所以在函数体中仍然可以定义函数。假设函数f2定义在函数f1中,那么就称f2为f1的内嵌(inner)函数,f1为f2的外包 (enclosing)函数,外包和内嵌都具有传递性,即f2的内嵌必然是f1的内嵌,而f1的外包也一定是f2的外包。内嵌函数可以访问外包函数已经创建的所有局部变量,这种特性便是所谓的词法定界(lexical scoping),而这些局部变量则称为该内嵌函数的外部局部变量(external  local variable)或者upvalue(这个词多少会让人产生误解,因为upvalue实际指的是变量而不是值)。试看如下代码:

  function f1(n)
  -- 函数参数也是局部变量
  
  local function f2()
  print(n) -- 引用外包函数的局部变量
  end
  return f2
  end
  
  g1 = f1(1979)
  g1() -- 打印出1979
  g2 = f1(500)
  g2() -- 打印出500
  
  当执行完g1 = f1(1979)后,局部变量n的生命本该结束,但因为它已经成了内嵌函数f2(它又被赋给了变量g1)的upvalue,所以它仍然能以某种形式继续“存活”下来,从而令g1()打印出正确的值。
  
  可为什么g2与g1的函数体一样(都是f1的内嵌函数f2的函数体),但打印值不同?这就涉及到一个相当重要的概念——闭包(closure)。事实上,Lua编译一个函数时,会为它生成一个原型(prototype),其中包含了函数体对应的虚拟机指令、函数用到的常量值(数,文本字符串等等)和一些调试信息。在运行时,每当Lua执行一个形如function...end 这样的表达式时,它就会创建一个新的数据对象,其中包含了相应函数原型的引用、环境(environment,用来查找全局变量的表)的引用以及一个由所有upvalue引用组成的数组,而这个数据对象就称为闭包。由此可见,函数是编译期概念,是静态的,而闭包是运行期概念,是动态的。g1和g2的值严格来说不是函数而是闭包,并且是两个不相同的闭包,而每个闭包可以保有自己的 upvalue值,所以g1和g2打印出的结果当然就不一样了。虽然闭包和函数是本质不同的概念,但为了方便,且在不引起混淆的情况下,我们对它们不做区分。
  
  使用upvalue很方便,但它们的语义也很微妙,需要引起注意。比如将f1函数改成:
  
  function f1(n)
  local function f2()
  print(n)
  end
  n = n + 10
  return f2
  end
  
  g1 = f1(1979)
  g1() -- 打印出1989
  
  内嵌函数定义在n = n + 10这条语句之前,可为什么g1()打印出的却是1989?upvalue实际是局部变量,而局部变量是保存在函数堆栈框架上(stack frame)的,所以只要upvalue还没有离开自己的作用域,它就一直生存在函数堆栈上。这种情况下,闭包将通过指向堆栈上的 upvalue的引用来访问它们,一旦upvalue即将离开自己的作用域(这也意味着它马上要从堆栈中消失),闭包就会为它分配空间并保存当前的值,以后便可通过指向新分配空间的引用来访问该upvalue。当执行到f1(1979)的n = n + 10时,闭包已经创建了,但是n并没有离开作用域,所以闭包仍然引用堆栈上的n,当return f2完成时,n即将结束生命,此时闭包便将n(已经是1989了)复制到自己管理的空间中以便将来访问。弄清楚了内部的秘密后,运行结果就不难解释了。
  
  upvalue还可以为闭包之间提供一种数据共享的机制。试看下例:
  
  function Create(n)
  local function foo1()
  print(n)
  end
  
  local function foo2()
  n = n + 10
  end
  
  return foo1,foo2
  end
  
  f1,f2 = Create(1979)
  f1() -- 打印1979
  f2()
  f1() -- 打印1989
  f2()
  f1() -- 打印1999
  
  f1,f2这两个闭包的原型分别是Create中的内嵌函数foo1和foo2,而foo1和foo2引用的upvalue是同一个,即Create的局部变量n。前面已说过,执行完Create调用后,闭包会把堆栈上n的值复制出来,那么是否f1和f2就分别拥有一个n的拷贝呢?其实不然,当Lua发现两个闭包的upvalue指向的是当前堆栈上的相同变量时,会聪明地只生成一个拷贝,然后让这两个闭包共享该拷贝,这样任一个闭包对该upvalue进行修改都会被另一个探知。上述例子很清楚地说明了这点:每次调用f2都将upvalue的值增加了10,随后f1将更新后的值打印出来。upvalue的这种语义很有价值,它使得闭包之间可以不依赖全局变量进行通讯,从而使代码的可靠性大大提高。
  
  闭包在创建之时其upvalue就已经不在堆栈上的情况也有可能发生,这是因为内嵌函数可以引用更外层外包函数的局部变量:
  
  function Test(n)
  local function foo()
  local function inner1()
  print(n)
  end
  local function inner2()
  n = n + 10
  end
  return inner1,inner2
  end
  return foo
  end
  
  t = Test(1979)
  f1,f2 = t()
  f1()        -- 打印1979
  f2()
  f1()        -- 打印1989
  g1,g2 = t()
  g1()        -- 打印1989
  g2()
  g1()        -- 打印1999
  f1()        -- 打印1999
  
  执行完t = Test(1979)后,Test的局部变量n就“死”了,所以当f1,f2这两个闭包被创建时堆栈上根本找不到n的踪影,这叫它们如何取得n的值呢?呵呵,不要忘了Test函数的n不仅仅是inner1和inner2的upvalue,同时它也是foo的upvalue。t =  Test(1979)之后,t这个闭包一定已经把n妥善保存好了,之后f1、f2如果在当前堆栈上找不到n就会自动到它们的外包闭包(姑且这么叫)的 upvalue引用数组中去找,并把找到的引用值拷贝到自己的upvalue引用数组中。仔细观察上述代码,可以判定g1和g2与f1和f2共享同一个 upvalue。这是为什么呢?其实,g1和g2与f1和f2都是同一个闭包(t)创建的,所以它们引用的upvalue(n)实际也是同一个变量,而刚才描述的搜索机制则保证了最后它们的upvalue引用都会指向同一个地方。
  
  Lua将函数做为基本类型值并支持词法定界的特性使得语言具有强大的抽象能力。而透彻认识函数、闭包和upvalue将帮助程序员善用这种能力。

posted @ 2012-02-28 20:13 多彩人生 阅读(2007) | 评论 (0)编辑 收藏

Lua语言-安装,编辑,编译,运行指导

既然开始学习Lua,就应该对它有个一个大体的了解,对于Lua语言的介绍可以看这里
http://baike.baidu.com/view/416116.htm【百度百科】
英文好的朋友也可以直接到Lua官方[url=javascript:;]网站[/url]去了解更多的内容
http://www.lua.org【Lua官方网站】
这次主要介绍一下学习Lua之前的准备工作。
(1) 下载Lua压缩包,下载页面是http://www.lua.org/download.html 最新版本是lua-5.1.2
也可以点击这里直接下载:http://www.lua.org/ftp/lua-5.1.2.tar.gz 它的体积很小,只有210K
(2)解压文件,比如解压到 D:/lua-5.1.2 文件夹内(以下均以此路径为例)。
(3)在 D:/lua-5.1.2 内,存在名为 /etc 的子目录。在此目录下找到 luavs.bat 文件,并将它复制到 D:/lua-5.1.2 中。
(4)双击执行 luavs.bat 批处理文件,如果执行成功,在 D:/lua-5.1.2/src 文件夹中会存在 luac.exe lua.exe两个文件。
(5)将 D:/lua-5.1.2/src 加入到系统路径中。
(6)检测Lua是否安装成功:
在"开始"--"运行"处输入 lua 然后回车,若出现cmd控制台界面且含有"[backcolor=rgb(255,]Lua 5.1.2"之类的文字,则说明Lua已经成功安装。如果提示没有找到该命令,请检查D:/lua-5.1.2/src 文件夹中是否存在 luac.exe lua.exe 两个文件,并确保已将 D:/lua-5.1.2/src 加入到系统路径中。
(7)打造一个简单的Lua编辑器:
这里我使用EditPlus 最新版本的下载页面:http://www.onlinedown.net/soft/7116.htm 【华军软件园】
根据个人习惯可以选择汉化版本或者英文原版,这里我以英文原版进行说明。
安装上EditPlus第一次运行时,需要输入注册码或试用30天。在网上搜得注册码如下:
Namewww.cnzz.cc
Code60A8E-21F10-5BZ83-ADW4E-F3TC9

我使用的版本是 EditPlus 2.31 Build 524,以上注册码可以使用。
注册成功后,打开 EditPlus,选择Tools -- Preferences ,选择setting & syntax,点击右面的Add 按钮增加一个文件类型,在下面的Descrīption栏里填写Lua[backcolor=rgb(255,]FIle extension栏里填写lua。注意到下面还有一栏可以选择Syntax File,这是提供Lua语法文件的地方。有了它,可以让EditPlus支持lua代码的高亮关键字显示。这个高亮支持代码可以在网上搜到,做成后缀名为[backcolor=rgb(255,]stx的文件就可以了。
我已经将lua.stx文件上传到csdn资源,下载地址http://download.csdn.net/source/257667【CSDN资源】
再选择左面的User tools选项,点击右面的Add Tool -- Program
之后,在Menu Text一栏中填入 Run_Lua
Command一栏中填入 lua
Argument一栏中填入$(FileName)
Initial directory一栏中填入$(FileDir)
更改所有设置之后,不要忘记点击[backcolor=rgb(255,]Apply应用,然后点击OK
选择File -- New -- Others... ,然后选择我们刚刚新创建的Lua文件,写入一行代码如下:
print("Hello,Lua")
然后保存一下。选择Tools菜单,最下面有自定义命令Run_Lua,点击此命令即可完成lua文件的执行(或者用快捷键 Ctrl + 1)。执行结果是弹出一个写有Hello,Lua的控制台。
至此,学习Lua的准备工作完毕,可以正式开始学习了。

posted @ 2012-02-16 22:52 多彩人生 阅读(4941) | 评论 (0)编辑 收藏

仅列出标题
共25页: First 17 18 19 20 21 22 23 24 25 

导航

统计

常用链接

留言簿(3)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜