编译通过testLogin

编译通过testLogin

  (2011-11-09 14:04:37)
标签: 

libjingle

 

杂谈

分类: C 学习笔记
  • 背景:新建一个工程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中也更隐蔽。

wxl
发布了81 篇原创文章 · 获赞 32 · 访问量 70万+

猜你喜欢

转载自blog.csdn.net/wxl1986622/article/details/73481356