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
你都不好意思跟人家打招呼
你说这样的高手,一个月得拿多少钱?
我觉得怎么着也得两千吧
两千 那是老板
五百封顶
你别嫌少 
还是日元
你得理解老板的处境
本来公司就经营的惨不忍睹
根本不会再多给你一分钱
什么叫编程高手 你知道吗?
编程高手就是写什么程序
都写最难的 不写最好的
所以,我们编程高手的口号(儿)就是
不求好用 但求难懂。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

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

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

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats