最近在研究ACE,买了本《ACE程序员指南》,例子程序竟然没有编译通过,链接不上。
int ACE_TMAIN (int, ACE_TCHAR *[])
{
ACE_TRACE (ACE_TEXT ("main"));
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IHi Mom\n")));
ACE_OSTREAM_TYPE *output =
new std::ofstream ("ostream.output.test");
// ACE_LOG_MSG->msg_ostream (output, 1);
ACE_LOG_MSG->set_flags (ACE_Log_Msg::OSTREAM);
ACE_LOG_MSG->clr_flags (ACE_Log_Msg::STDERR);
ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
return 0;
}
如果不注释掉,link就会失败,
[Linker Error] Unresolved external 'ACE_Log_Msg::msg_ostream(_STL::basic_ostream<char, _STL::char_traits<char> > *, int)' referenced from D:\BORLAND\CBUILDER6\PROJECTS\ACE\LOGGING\USE_OSTREAM.OBJ
注释掉就没问题。这可是《ACE程序员指南》里的例子程序,怎么还有这种问题?
到出寻找答案,都没有结果。最后还是自己解决,原来是BCB5,BCB6共存造成的。
在命令行使用make的时候调用的路径BCB5在前面,所以生成的ace_b.dll是BCB5的,到了BCB6里面就会出错。
修改了路径配置,分别生成了BCB5和BCB6的ace_b.dll,再编译运行出错程序,就一切正常了。
另外还有一个链接错误需要$(BCB)\Lib\psdk\ws2_32.lib ,如下
[Linker Error] Unresolved external 'WSAEventSelect' referenced from D:\BORLAND\CBUILDER6\PROJECTS\ACE\REACTOR\CLIENT.OBJ