最近在研究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