编译通过testLogin
(2011-11-09 14:04:37)- 背景:新建一个工程testLogin,将example\login中的两个cc文件加入到source中,设置路径及包含lib文件,加入预编译命令后,编译时出现大量的LNK2019错误。这个错误说的是在代码中使用了某些函数,但这些函数没有在任何lib文件中被定义过。也就是存在lib文件missing。例如:
1>jingle.lib(socketaddress.obj) : error LNK2019: unresolved external symbol __imp__inet_addr@4referenced in function "int __cdecl inet_aton
2>jingle.lib(schanneladapter.obj) : error LNK2019: unresolved external symbol __imp__ApplyControlToken@8 referenced in function "public: virtual int __thiscall talk_base::SChannelAdapter::Close(void)
3>jingle.lib(network.obj) : error LNK2019: unresolved external symbol _GetAdaptersInfo@8referenced in function "protected: static bool __cdecl talk_base::BasicNetworkManager::CreateNetworks
解决:以jingle.lib(socketaddress.obj)为例,从socketaddress.cc找到出错的函数net_aton\inet_addr,发现其定义在WinSock2.h中,这是Microsoft Platform SDK的一个组件,要使用它必须包含WS2_32.lib。同样的对jingle.lib(schanneladapter.obj) 则要包含Secur32.lib,Crypt32.lib。3>GetAdaptersInfo函数在
-
Iphlpapi.h\Iphlpapi.lib里。包含了全部4个lib后,就可以编译通过了。
按同样的方法,成功地编译了call.exe!!
- 还有可能出现关于buzz::QName的问题,那么就是constants.cc的文件名冲突。在libjingle中,有两个同名的文件:constants.cc。如果不作处理,则两个文件生成的obj文件会出现在同一个文件夹,这样后生成的obj文件就会覆盖前一个,从而导致jingle.lib里没有前一个constants定义的变量。为解决这个问题,在VS 2010中可以把Output Files -> Output File Name改成$(IntDir)%(RelativeDir)\。而在VS 2008中没有这个选项,解决办法就只能是将其中一个constants.cc改文件名。
值得注意的是,在VS2010中这会引起一个warning,但在VS2008中却没有warning,因而这个问题在VS2008中也更隐蔽。