2007年六月月 发布的文章

成功Build ACE

近期公司实行新的绩效考核机制,我的考核目标中就有一项叫做:"成功使用新技术、框架、思路等至少3个",呵呵,先不论绩效考核机制是否合理,既然已经这样了那就需要去适应。一直在做Network Application,早就知道ACE在业界中的名气,这回有理由找个时间好好挖掘一下ACE的思路,也为我的绩效目标增色啊^_^。

以上只是开个玩笑罢了。上周末去书店看到电子工业出版社再次出版的'C++网络编程卷一',这套书的卷1以及卷2的英文电子版我早已有了,但是还是喜欢抱着纸板书看书的那种感觉,所以就顺便买了下来。翻看了一下,发现里面的内容恰恰是现在我所需要的,如果是前两年看这本书,理解起来肯定不会很透彻,因为那时的心中缺少的是恰恰是问题和困惑,没有了那些东西看书的效果也就大打折扣;反之如果作者的思路恰恰是把你扶上的正确的思维轨道,以帮助你解决了心中的那个结,你的收获就会是大大的。

记得前年的时候曾经下载过ACE并且尝试从源代码Build,结果是失败了,原因现在已经记不清了;这次重新下载ACE-5.5版本在Solaris 9上用G++ 3.2编译,居然顺利通过,其功劳应该归功于ACE的开发者之一Stephen D. Huston的'The ACE Programmers Guide'一书,而且从ACE自带文档中得知,ACE最先就是在Solaris上开发的。

Build过程:
1. 下载ACE的源码包;解包解压,一般你会在当前目录下获得一个名为'ACE_wrappers'的目录;
2. 设置ACE_ROOT环境变量;如我用的是csh,我就会在用户的HOME路径下的.cshrc中增加一个环境变量ACE_ROOT,比如:setenv ACE_ROOT '/export/home1/baim/ACE_wrappers';
3. 切换路径到$ACE_ROOT/ace/下,创建config.h,在这个头文件中,我们需要做一件事,就是include一个你所在的编译平台的头文件,比如我是在Sun Solaris 9上编译的,我的config.h中的内容就是这样的:
//config.h
#include "config-sunos5.9.h"

不同的平台,包含的头文件不同,这些头文件也都在$ACE_ROOT/ace/下,你可以用'ls -l|grep config'来看看究竟有哪些config头文件,选择你所在平台对应的即可。

4. 切换到$ACE_ROOT/include/makeinclude下,创建一个叫'platform_macros.GNU'的文件,同样这里也有平台相关的一堆.GNU文件,我们只需在我们新建的platform_macros.GNU文件中包含对应文件即可。
如我用g++在Solaris 9上编译,我就该选择:platform_sunos5_g++.GNU
//platform_macros.GNU
include $(ACE_ROOT)/include/makeinclude/platform_sunos5_g++.GNU

这个文件里还可以放置make的编译选项,比如我要生成.a文件,我可以这么做:
//platform_macros.GNU
static_libs=1
include $(ACE_ROOT)/include/makeinclude/platform_sunos5_g++.GNU

5. 切换到$ACE_ROOT/ace/下,输入make命令执行即可。编译的过程是漫长的,大约1个小时,之后你就会发现在$ACE_ROOT/ace/下有libACE.so -> libACE.so.5.5.0*、libACE.so.5.5.0*和libACE.a出现了。

构建过程到此结束。

ACE的makefile没有.phony install,所以在你的ACE应用程序里可直接引用$(ACE_ROOT)/ace下面的头文件,直接链接$(ACE_ROOT)/ace下面的libACE.a库即可。

//HelloACE.cpp
#include "ace/Log_Msg.h"

void foo (void);

int ACE_TMAIN (int, ACE_TCHAR *[])
{
  ACE_TRACE(ACE_TEXT ("main"));

  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHi Mom\n")));
  foo();
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));

  return 0;
}

void foo (void)
{
  ACE_TRACE (ACE_TEXT ("foo"));

  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHowdy Pardner\n")));
}

//编译
g++ -o HelloACE HelloACE.cpp -I$ACE_ROOT -I./ -L$ACE_ROOT/ace -lACE  -lsocket -ldl -lgen -lnsl -lposix4 -lthread

这里有几点注意事项:
1、如果libACE.so.5.5.0*和libACE.a都同时在$ACE_ROOT/ace下的话,上面的编译命令默认优先进行动态链接。也就是说编译出来的可执行程序HelloACE在运行的时候如果找不到libACE.so.5.5.0就会报错。
2、如果想进行静态链接的话,可以将$ACE_ROOT/ace下的libACE.so.5.5.0删除或者改名,这样在执行上面的编译命令后即是静态链接。
3、注意g++链接.a和.o时是有顺序的,g++从左到右读入目标文件或.a文件中的符号,如果靠右边的目标文件或者.a文件中没有靠左面的目标文件或者.a文件中的未定义的符号定义的话(或者白话一点说:右边没有左边想要的),程序就会报错。比如我们把上述的编译命令改一下,改为:
g++ -o HelloACE -I$ACE_ROOT -I./ -L$ACE_ROOT/ace -lACE  -lsocket -ldl -lgen -lnsl -lposix4 -lthread HelloACE.cpp
执行命令后,会出现下面错误提示:

未定义                  文件中的
 符号                       在文件中
ACE_Log_Msg::log(ACE_Log_Priority, char const*, …)/var/tmp//ccBl9Q0L.o
ACE_Log_Msg::last_error_adapter()      /var/tmp//ccBl9Q0L.o
ACE_Log_Msg::conditional_set(char const*, int, int, int)/var/tmp//ccBl9Q0L.o
ACE_Log_Msg::instance()             /var/tmp//ccBl9Q0L.o
ld: 致命的: 符号参照错误. 没有输出被写入HelloACE
collect2: ld returned 1 exit status

实际上上面的命令g++ -o HelloACE -I$ACE_ROOT -I./ -L$ACE_ROOT/ace -lACE  -lsocket -ldl -lgen -lnsl -lposix4 -lthread HelloACE.cpp等价于下面两个命令:

g++ -c -I$ACE_ROOT -I./ HelloACE.cpp
g++ -o HelloACE -L$ACE_ROOT/ace -lACE  -lsocket -ldl -lgen -lnsl -lposix4 -lthread HelloACE.o

其实上面错误提示中的"/var/tmp//ccBl9Q0L.o",其实就是一个匿名的HelloACE.o

另外在'The ACE Programmers Guide'一书中,作者给了个Makefile,如下:
BIN   = HelloACE
BUILD = $(VBIN)
SRC = $(addsuffix .cpp,$(BIN))
LIBS =
LDFLAGS = -L$(PROJ_ROOT)/lib
#—————————————————
#Include macros and targets
#—————————————————
include $(ACE_ROOT)/include/makeinclude/wrapper_macros.GNU
include $(ACE_ROOT)/include/makeinclude/macros.GNU
include $(ACE_ROOT)/include/makeinclude/rules.common.GNU
include $(ACE_ROOT)/include/makeinclude/rules.nonested.GNU
include $(ACE_ROOT)/include/makeinclude/rules.bin.GNU
include $(ACE_ROOT)/include/makeinclude/rules.local.GNU

直接用该Makefile会让你的build更简洁,另外还有支持多个.cpp文件的Makefile在那本书里,大家可以参考。

转载'编程大腕'

在公司内网看到一则趣帖,这里转载一下。

编程大腕

写就要写最难懂的程序
用记事本做编辑器
编译就得用最难用的编译器
程序不带半点注释
程序里面至少要有三个类
什么多继承呀, 多线程呀,template呀,inline呀
能给他用的全给他用上
一行里面有while有++有?:有goto
文章里面一定要搬出一个XX哥
用很随意的语气,关系特好的样子
如果自己出书 ,甭管是什么语言
一开头都打印
"hello world! "
一副专业人士的派头(儿)
倍(儿)有感觉
编程中场再去冲杯咖啡
咖啡要雀巢的
一个程序最多也就一两个小时就搞定
最后再来句"最近感冒了,哎~"
就一个字(儿) 酷
用下你写的程序就得要跟七八十个参数
同行的人不是用C就是用汇编
你要是用VB
你都不好意思跟人家打招呼
你说这样的高手,一个月得拿多少钱?
我觉得怎么着也得两千吧
两千 那是老板
五百封顶
你别嫌少 
还是日元
你得理解老板的处境
本来公司就经营的惨不忍睹
根本不会再多给你一分钱
什么叫编程高手 你知道吗?
编程高手就是写什么程序
都写最难的 不写最好的
所以,我们编程高手的口号(儿)就是
不求好用 但求难懂。

汉密尔顿夺职业首冠,阿隆索为不地道付出代价

正如在法国摩纳哥站后我谈到的'汉密尔顿,首个分站赛冠军只是时间问题!'一样,在今天凌晨举行的F1加拿大站的比赛中小将汉密尔顿不负众望,继在前天拿到自己F1的第一个杆位后,又拿到了自己职业生涯的第一个分站赛冠军,也是本赛季唯一保持每站都登上领奖台的车手,至于他保持的新人记录仍强劲的持续着。

这站比赛应该说是很精彩,各种精彩比赛因素都具备,10辆赛车退赛,4次安全车出动,特别是库比卡的'撞车表演'更是让人们感受到了赛车运动的极大危险性。而唯一稳定发挥的汉密尔顿笑到了最后,而阿隆索则为自己在发车时的不地道付出了代价,很显然他是想超车,超队友汉密尔顿的车;看过前几站比赛的人都知道,特别是摩纳哥站的人都会清楚的记得汉密尔顿为阿隆索挡住后车超车的举动,而这次两人换位后,阿隆索居然这么不地道。本站结束后汉密尔顿领先阿隆索8分,只要迈凯轮不偏不相,汉密尔顿的辉煌还会一直持续下去。

反观法拉利马萨应该说缺少舒马赫的那种稳重和成熟,这也许和他南美巴西人的性格有关,而这样很容易大起大落,导致法拉利战绩一路下滑,莱科宁本赛季则是运气不佳,很难说今后发展会如何。

汉密尔顿这时候应该冷静,毕竟F1赛季还很漫长,一站胜利算不得什么,只有战胜自己才能赢得尊敬、赢得冠军,毕竟成为新一代车王的路还很长。

这里顺便说一下昨晚的法网男单决赛,费天王的遗憾依旧持续着,这里只能说:费天王坚持住,明年法网从头再来。


汉密尔顿加拿大站夺魁




这里是Tony Bai的个人Blog,欢迎访问、订阅和留言!订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您喜欢通过微信App浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:



本站Powered by Digital Ocean VPS。

选择Digital Ocean VPS主机,即可获得10美元现金充值,可免费使用两个月哟!

著名主机提供商Linode 10$优惠码:linode10,在这里注册即可免费获得。

阿里云推荐码:1WFZ0V立享9折!

View Tony Bai's profile on LinkedIn


文章

评论

  • 正在加载...

分类

标签

归档











更多