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

發佈了81 篇原創文章 · 獲贊 32 · 訪問量 70萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章