avatar
Today is 星期二
2010年09月7日

2009年08月26日

关于Boost之编译参数说明

由 晨笛 — 分类目录: C/C++评论暂缺


bjam --build-type=complete --with-regex --toolset=msvc-9.0 stage
bjam --build-type=complete --with-system --toolset=msvc-9.0 stage
bjam --build-type=complete --with-thread --toolset=msvc-9.0 stage
bjam --build-type=complete --with-date_time --toolset=msvc-9.0 stage

stage/install :stage表示只生成库(dll和lib),install还会生成包含头文件的include目录。本人推荐使用 stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录(E:\SDK \boost_1_39_0\boost,只比include目录多几个非hpp文件,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。

toolset :指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等。

without/with :选择不编译/编译哪些库。本人不需要编译python库,所以排除之,可以根据各人需要选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页http://www.python.org下载安装。

stagedir/prefix :stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不同的IDE指定不同的目录,如VS2008对应的是E:\SDK\boost_1_39_0\vc9\lib,VC6对应的是E:\SDK\boost_1_39_0 \vc6\lib,否则都生成到一个目录下面,难以管理。如果使用了install参数,那么还将生成头文件目录,vc9对应的就是E:\SDK \boost_1_39_0\vc9\include\boost-1_39\boost,vc6类似(光这路径都这样累赘,还是使用stage好)。

build-dir :编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录(E:\SDK\boost_1_39_0)下,目录名为bin.v2,等编译完成后可将这个目录全部删除(没用了),所以不需要去设置。

link :生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用static方式。这里需要注意的是,static 方式下,最终生成的很多静态链接库大小都在几兆、几十兆,甚至接近百兆。这么大的库我们一般是不会采用静态链接方式的,所以这些库不推荐以static方式编译(without掉);如果已经编译了赶快删,肯定没用,否则将占用近1G的硬盘空间。以下是巨型库黑名单:wave、graph、math、 regex、test、program_options、serialization、signals。

runtime-link :动态/静态链接C/C++运行时库。同样有shared和static两种方式,这样runtime-link和link一共可以产生4种组合方式。虽然它和link属性没有直接关系,但我们习惯上,一个工程如果用动态链接那么所有库都用动态链接,如果用静态链接那么所有库都用静态链接。所以这样其实只需要编译2种组合即可,即link=shared runtime-link=shared和link=static runtime-link=static。

threading :单/多线程编译。一般都写多线程程序,当然要指定multi方式了;如果需要编写单线程程序,那么还需要编译单线程库,可以使用single方式。

debug/release :编译debug/release版本。一般都是程序的debug版本对应库的debug版本,所以两个都编译。

2009年07月13日

入住杨浦

由 晨笛 — 分类目录: 杂记1 条评论

从今天开始,告别了生活学习了3年多的中山公园和华师大,将住所搬到了杨浦区。房东是位60岁左右的老婆婆,贫嘴是给我留下的第一印象,同一件事要跟我说上好几遍,当然我也得应付好几遍。整个小区整洁干净,房子不大,但也够用,晚上楼下也有空余停车位。要说缺点就是主卧的照明灯具和次卧没有安装空调吧。把一切打扫干净后,总体上还是不错。

昨晚在这里睡了一夜,适应能力较强的我没有什么不良反应。早上6点45分被闹钟叫起来,梳洗完后,又稍稍整理了一下房间,7点20分便出门了。只比以前提早半小时,倒也不在乎。原本出门是一条车水马龙的小马路,取而代之的是人群熙熙攘攘的路边菜市场,这让我一开始以为自己是不是看错时间了。7点30分坐上8号线,我这里是起点第2站,可是已经没有座位了,但站得挺舒服,嘻嘻。一路上8号线运行基本稳定。来到人民广场换乘,虽然下车的人很多,但我不愿做地铁小霸王,所以还是选择站立,8点45分到达公司。

在大家的帮助下,搬家过程很顺利,可是日后遇到的困难我得自己去面对了。也许我将在这里住上1年,一切顺其自然吧。

2009年07月2日

用vc9编译qt4.3.1

由 晨笛 — 分类目录: C/C++评论暂缺

qt4.3.1与vc9是兼容的。

编译过程如下:
C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat
set QMAKESPEC=win32-msvc2005
set QTDIR=C:\Qt_433
cd C:\Qt_433
configure
nmake

2009年06月5日

基于Tiny C Compiler的C语言脚本混合编程方法

由 晨笛 — 分类目录: C/C++评论暂缺

TCC简要介绍:

TCC 最有趣的特性是可以用 UNIX 系统上常见的 #!/usr/bin/tcc 的方式来执行 ANSI C 语言写就的源程序,省略掉了在命令行上进行编译和链接的步骤,而可以直接运行 C 语言写就的源程序。这样就能做到像任何一种其它的脚本语言比如 Perl 或者是 Python 一样,显著的加快开发步调。可以像编写 Shell 脚本一样的使用 C 语言,随便想一想都觉得是一件奇妙的事情。但是 TCC 还有一些其它的特性呢!

    * TCC 的体积非常小,全部源代码打包压缩以后不到 200 K 字节大小,编译后的 tcc 可执行程序不过 80 K 字节大小。这意味着我们几乎可以在任何场合使用 TCC 提供给我们的编写 C 语言脚本的能力。这其中当然包括硬盘空间十分紧张的环境,比如嵌入式系统和启动软盘等等。
    * 在给 TCC 的源程序中可以使用任何在给 GCC 的源程序中可以使用的动态链接库。TCC 不仅支持标准的 ANSI C 语言,而且也支持 ISO C99 标准和一部分来自于 GCC 的对 C 语言所做的扩展。
    * TCC 直接生成经过部分优化的 X86 机器代码。并不需要生成任何虚拟机的二进制代码。据 TCC 作者提供的数据,TCC 的编译速度比 GNU C 编译器在不做任何代码优化工作(gcc -O0)的时候都要快。当然啦,要是让 GCC 做代码优化的话,那么编译速度就更加比不上 TCC 喽。
    * Libtcc 库能够让用户将TCC作为作为动态代码生成的后端,在libtcc.h中有API的说明,libtcc_test.c是使用libtcc的简单例子。 Libtcc包含了这样一种思想,用户可以将程序包含在字符串中,然后直接编译,接下来就可以存取全局符号(函数和变量)。

生成LIBTCC:
       由于libtcc是基于linux的,为了能够生成window下的动态连接库,我们先要使用mingw/msys编译,然后用下面的语句生成dll。为了方便msvc使用,还需要再生成lib库用于链接。整个步骤如下:
1) 生成DLL
gcc -O2 -shared -Wall -Wl,–export-all-symbols -mpreferred-stack-boundary=2 -march=i386 -falign-functions=0 -fno-strict-aliasing -DTCC_TARGET_PE -DLIBTCC -o libtcc.dll tcc.c
2) 生成def
pexports libtcc.dll | sed “s/^_//” > libtcc.def

3) 从def生成lib
lib /machine:i386 /def:libtcc.def
    由于c语言编程需要头文件和库,我们也需要在发布程序的时候带上include目录和lib目录,然后在主程序中指定该路径。

TCC和主程序的配合:
       在我们的程序中,主要把固定的逻辑放在主程序中,而将变化的东西放在tcc脚本中。该程序的基本流程如下:
       按照用户的输入参数打开截包,按照指定的类型将每一个数据报合适的数组片断传给用户写的tcc程序,由tcc程序将处理后的数据传给主函数,由主函数进一步处理,比如写入文件中。
注意到我们需要处理的可能是rtp包,也可能是没有rtp头的包,在输出的时候,有些码流也需要加入额外的处理,比如h261和h263需要调用主程序中的函数进行sbit,ebit的拼接;比如h263+的简单处理,比如h264的流头的添加,比如音频的直接输出。所以我们在主程序和tcc程序间不光要传递变量,还需要传递函数。
下面是大概的代码框架和解释。

主程序:——————————————————————————-
TCCState *s;
创建新的tcc状态
    s = tcc_new();
    if (!s) {
        fprintf(stderr, “Could not create tcc state\n”);
        exit(1);
    }
       添加路径:
       tcc_add_include_path(s,fullinc);
       tcc_add_library_path(s,fulllib);

       设置输出方式为内存:
       tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
       编译一个文件到tcc中(其实是读文件到缓冲区,然后调用了tcc_compile_string)
       tcc_compile_file(s,fullpath);
       将变量和函数符号加入到tcc环境中去,这样在tcc中就可以直接使用这些符号
       tcc_add_symbol(s, “encodeflag”, (unsigned long)&encodeflag);
       tcc_add_symbol(s,”f”,(unsigned long )&f);
       tcc_add_symbol(s,”Enter_H263Decode”,(unsigned long)&Enter_H263Decode);
       tcc_add_symbol(s,”writeFile”,(unsigned long)&writeFile);

       做所有的重定位工作,在tcc_get_symbol之前必须调用
       tcc_relocate(s);
       获取tcc中的函数和变量符号
    tcc_get_symbol(s, &val, “Process”);
    Process = (pf_Process)val;
       tcc_get_symbol(s,&val,”withRtp”);
       withRtp=(int)(*(int *)val);
       tcc_get_symbol(s,&val,”offset”);
       offset=(int)(*(int *)val);
       循环处理每一个数据包
       while((res = pcap_next_ex( fp, &header, &pkt_data)) >= 0)
{
       。。。
调用tcc中的处理函数
       Process(&pkt_data[offset],totallen);
}

清理tcc环境
tcc_delete(s);

TCC程序 ——————————————————————————
#include <stdio.h>
#include <stdlib.h>

int withRtp=1;
int offset=54;
unsigned char zero[2]={0,0};
unsigned char h264head[4]={0,0,0,1};

extern FILE *f;
extern unsigned char encodeflag;
extern int writeFile(unsigned char *buf,int len);

int Process(unsigned char *pt,int len)
{
       if(encodeflag==0 ||encodeflag==1)
       {/*h261或者h263*/
              if((pt[0])&0×7==0)
              {
                     Enter_H263Decode(len,pt,1);
              }
              else
              {
                     Enter_H263Decode(len,pt,0);
              }                  
       }
       else if(encodeflag==2)
       {/*h263+*/
        if((pt[0]==0×04) && (pt[1]==0×00))
        {
                  writeFile(zero,2);
                  writeFile(&pt[2],len-2);
           }
        else if((pt[0]==0×00) && (pt[1]==0×00))
        {
                  writeFile(&pt[2],len-2);               
           }
        else
        {
               printf(“not correct 263+ format\n”);
        }
                    
       }
       else if(encodeflag==3)  
       {/*raw data*/
              fwrite(pt,1,len,f);
       }
       else if(encodeflag==4)
       {/*mp3*/
              if(pt[0]==0xff && pt[1]==0xfb)
              {
                     writeFile(&pt[4],len-4);
              }
              else
              {
                     printf(“not a mp3 header,%02X %02X\n”,pt[0],pt[1]);
              }                  
       }
       else if(encodeflag==5)
       {/*h264*/
              writeFile(h264head,4);
              writeFile(pt,len);
       }
       else
       {
              ;
       }   
       return 0;
}

从上面的例子可以看出,使用tcc,可以很容易的处理数组,毕竟,采用其他脚本语言的话,比如lua,perl等,要想处理数组,要想容易的进行位运算,还是很麻烦的,而且,c语言毕竟是大多数人熟悉的语言,使用起来很方便。

2009年03月28日

推荐一下《天下贰》里的背景音乐

由 晨笛 — 分类目录: 杂记2 条评论

最近公司在做3D MMO游戏,我主要负责整个服务器部分。以我的风格,客户端方面的事我也要喜欢插手说两句的,嘻嘻。底层通讯基本稳定下来了,于是开始做玩家之间的行走交互,在位置状态同步上出了点问题。于是想借鉴一下现有的其他公司的成功产品。就看看《天下贰》吧,(PS:一直很喜欢网易的产品,严密谨慎,做工考究)。我半年多前看过这款游戏,画面很美,背景音乐很好听。这次上去更新了60多个版本,彻头彻尾地重构了一把,汗,连背景音乐都换了,不过依然很好听,于是抽时间整理了出来跟大家分享^_^

虽然有的唯美幽静,有的凄美悲伤,有的压抑郁闷,有的轻松活跃,但是每一首都是那么有感觉,呵呵,我非常喜欢:)

新天下贰系列

1. 新天下贰 – 登录背景音乐(这是游戏给人的第一印象)

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

2. 新天下贰 – 江南背景音乐(回旋的调子,压抑,悲凉,无奈)

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

3. 新天下贰 – 翎羽门派背景音乐
我站在山顶上,看着白雪霭霭的世界,看着雄鹰在天际翱翔,我的心突然变得开阔起来,不禁对着天空呐喊,“嘿~~~~”,于是我的回音在山谷久久的回荡。。。
我就生活在这里,我与这片大山为伍,这里就是我的家。
这片纯洁的土地!

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

4. 新天下贰 – 燕丘背景音乐(凄美)

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

5. 新天下贰 – 盐泉村背景音乐(闭上眼睛,能想象出一个恬静优美的村庄。笛声很好听,有时间我要学会吹这个曲子)

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

6. 新天下贰 – 弈剑门派背景音乐(听说有人听完只想落泪,太悲,哈哈)

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

7. 新天下贰 – 应龙湖背景音乐(郁闷)

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

8. 新天下贰 – 云麓门派背景音乐(空谷幽兰,云雾缭绕)

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

9. 新天下贰 – 紫荆谷背景音乐

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

老天下贰系列

1. 老天下贰 – 登录背景音乐(超级大气,华丽)

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

2. 新天下贰 – 冰心堂门派背景音乐(晶莹剔透的感觉)

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

3. 老天下贰 – 流云渡背景音乐(洪湖水浪打浪)

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

4. 老天下贰 – 木渎镇背景音乐(新手村里的音乐,一听就喜欢)

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

5. 老天下贰 – 不知道是哪里的背景音乐

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

2009年02月24日

Erlang性能初测

由 晨笛 — 分类目录: 网络评论暂缺

安装的CentOS的最初目地是为了进行对Erlang的测试,因为在Windows 2003上连接数到达1024时就出问题了。

昨天已经把Erlang编译安装好了,于是马上就可以进行测试了。

测试服务器端程序很简单,服务器为每个连接分配一个Erlang进程来为它服务。

测试内容是连接10000个客户端。

可是结果和Windows系统下一样,到达1024就不行了。

原来问题还是出在操作系统对进程数的限制,用
ulimit -n 102400
把最大进程数调整到102400个,哈哈。

这下顺利通过了10000个连接。可是对性能结果不是很满意,成功连接1000个客户端总共花了9秒多,汗~
直觉告诉我应该是我的错,得知Erlang默认没有使用epoll,于是使用
erl +K true
打开kernel-poll后,这次的结果是3秒多,还是不够理想。这个问题待日后优化吧。

2009年02月23日

CentOS使用心得(二)

由 晨笛 — 分类目录: Unix评论暂缺

下午打算在CentOS 5.1上编译Erlang-R12B-5,还是遇到一些问题。

首先从Erlang官方下载了最新的源码包,解压后
./configurate –enable-threads –enable-kernel-poll
遇到找不到jdk和odbc的问题,然后下载了jdk-6u10-linux-i586-rpm.bin、unixODBC、unixODBC-devel。

一、安装JDK
(1)在opt下新建一个java文件夹
mkdir /usr/java
(2)我用的ftp将JDK文件放入到/usr/java文件夹下
放入后,执行下面这个命令:
cd /usr/java
chmod a+x jdk-6u10-linux-i586-rpm.bin使当前用户拥有对jdk-6u10-linux-i586-rpm.bin的执行权限
(3)执行安装
./jdk-6u10-linux-i586-rpm.bin
运行jdk-6u10-linux-i586-rpm.bin,这时会显示出JDK的安装许可协议,按空格翻页,最后程序会问你是不是同意上面的协议,当然同意啦,输入“yes”之后开始解压JDK到当前目录。此时屏幕上会显示解压的进度。
解压完成后/usr/java目录下会新建一个名为“jdk1.6.0_01”的目录,至此我们已经在CentOS下安装好了JDK。

二、配置JDK
理论上来说JDK装好了以后就可以正常使用了,但是为了我们日后使用的方便,我们还要对它设置一下。与Windows下的JDK设置一样,我们通常需要设置一下环境变量。
我习惯修改/etc/profile来添加环境变量,/etc/profile中设置的环境变量就像Windows下环境变量中的系统变量一样,所有用户都可以使用。
由于CentOS自带了JRE环境,需要卸载alternatives文件中的java
rm /var/lib/alternatives/java,输入’y’确定。

用文本编辑器打开/etc/profile
vi /etc/profile
在最后加入以下几行:
export JAVA_HOME=/usr/java/jdk1.6.0_1
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
这样我们就设置好了JDK,用reboot命令重启一下机器就可以了。

三、删除/卸载JDK
删除JDK,别忘了把配置文件的相关内容也清空啊
rm -fr jdk1.6.0_1

四、安装unixODBC
yum install unixODBC

五、安装unixODBC-devel
yum install unixODBC-devel

这下./configurate –enable-threads –enable-kernel-poll可以顺利通过了。

然后make时又遇到棘手问题了,原来是CentOS 5有bug,ssl需要依赖keyutils和selinux这两个lib。因此编译的时候,需要手工指定链接这两个lib。即编辑Erlang源码包里的lib/ssl/c_src/Makefile.in这个文件,修改
LIBS = @LIBS@

LIBS = @LIBS@ -lkeyutils -lselinux
重新./configure,make即可。

CentOS使用心得(一)

由 晨笛 — 分类目录: Unix评论暂缺

第一次安装CentOS来使用,遇到一些麻烦,记录一下。:

CentOS安装好,默认只打开了22端口,如果希望开放其他端口的话,需要打开所需端口。比如打开http的默认端口80

编辑iptables
vi /etc/sysconfig/iptables

添加
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 3001 -j ACCEPT

重新启动服务
/sbin/service iptables restart

查看端口是否开放
/sbin/iptables -L -n

因为暂时只在局域网内使用,所以最后索性关闭了防火墙
/etc/init.d/iptables status 会得到一系列信息,说明防火墙开着。
/etc/init.d/iptables stop 永久关闭。

对了,我使用的是CentOS 5.1 2008.4.19的版本。

2009年02月22日

周末两天的成果展示

由 晨笛 — 分类目录: 作品评论暂缺

今天太晚了,说明下次补上:-)

2009年01月26日

牛年大吉

由 晨笛 — 分类目录: 杂记评论暂缺

页数: 上一页 1 2 3 4 5 6 7 8 下一页
© 2010 晨笛的博客 All rights reserved - Wallow theme by TwoBeers Crew - Powered by WordPress - 使用愉快!