編譯通過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中也更隱蔽。