2010-08-04 163 views
4

。當我使用這個庫編寫示例程序時,我遇到了以下鏈接器錯誤。正如我們所看到的,這些所有「未解決」的符號都是Windows API函數,而這些Windows API函數被ITK庫使用,而不是我的程序。我使用的是<a href="http://www.itk.org" rel="nofollow noreferrer">ITK library</a>鏈接Windows的API

Error 1 error LNK2019: unresolved external symbol [email protected] referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" ([email protected]@@[email protected]) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj) 
Error 2 error LNK2019: unresolved external symbol [email protected] referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" ([email protected]@@[email protected]) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj) 
Error 3 error LNK2019: unresolved external symbol [email protected] referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" ([email protected]@@[email protected]) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj) 
Error 4 error LNK2019: unresolved external symbol [email protected] referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" ([email protected]@@[email protected]) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj) 
Error 5 error LNK2019: unresolved external symbol [email protected] referenced in function "private: static bool __cdecl gdcm::Util::GenerateUUID(unsigned char *)" ([email protected]@[email protected]@[email protected]) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj) 
Error 6 error LNK2019: unresolved external symbol [email protected] referenced in function "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl gdcm::Util::GetIPAddress(void)" ([email protected]@[email protected]@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@XZ) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj) 
Error 7 error LNK2019: unresolved external symbol [email protected] referenced in function "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl gdcm::Util::GetIPAddress(void)" ([email protected]@[email protected]@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@XZ) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj) 
Error 8 error LNK2019: unresolved external symbol [email protected] referenced in function "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl gdcm::Util::GetIPAddress(void)" ([email protected]@[email protected]@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@XZ) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj) 

這些錯誤在我的腦海裏提出了幾個問題。對於他們中的一些人,我想我知道答案,但如果我是對還是錯,我需要確認。

  1. 這些Windows API函數用於gdcmUtil.cpp(因爲它表示爲gdcmUtil.obj)。因此,編譯器將gdcmUtil.cpp編譯爲(比如說)gdcmUtil.asm,並且它是彙編程序將其組裝到gdcmUtil.obj中。由於在編譯庫時我們不會生成任何exe文件。這些* .obj文件不與任何其他* .obj鏈接。因此,Windows API符號仍然是該模塊的外部符號,因此無法解決。對?

  2. 誰產生是* .lib文件?我的意思是編譯器正在生成* .s文件,並且彙編程序正在生成* .obj文件,我們沒有使用鏈接器。那麼,我們從哪裏得到* .lib文件?誰將所有* .obj文件打包到* .lib文件?

  3. 如何(這是用C語言編寫,並使用Windows API的程序)的Windows API應用程序被編譯?我的意思是,因爲它的獨立應用程序如何解決這些WIN32 API符號?假設,我寫過這樣的程序,任何人都可以告訴我我需要什麼來成功構建應用程序?

  4. 我知道Windows API是在kernel32.dll,gdi32.dll,user32.dll(它可能反過來導入一些其他dll,如wsock32.dll的網絡API等)實現,但問題是如何使用Windows API函數中的這些函數在C程序中。我的意思是如何動態地對這些DLL

  5. 鏈接在我的追求找到答案,我的鏈接錯誤的問題。我發現我必須爲鏈接器輸入添加wsock32.lib(用於WinSock 1.1)或ws2_32.lib(用於WinSock 2)或snmpapi.lib。

    1. 因爲當Windows API被靜態鏈接?
    2. 從什麼時候Windows API在靜態庫(* .lib文件)中發貨?
    3. 在哪個目錄中可以找到所有這些奇怪的* .lib文件?
  6. 現在,除了將* .lib文件添加到鏈接器輸入文件之外,還有其他解決方案嗎?因爲當我使用一些新的ITK庫函數時,我得到一個新的鏈接器錯誤。我要谷歌找到哪個* .lib文件這個特定的符號(窗口api函數)所屬,然後將該* .lib文件添加到我的鏈接器輸入。這讓我瘋狂!有沒有理智的方法?

+1

每個函數的MSDN頁面都包含它所屬的lib文件。例如:http://msdn.microsoft.com/en-us/library/aa378899(VS.85).aspx – claws 2010-08-05 03:58:13

回答

3
  1. 是的,沒錯。
  2. 誰產生的.lib文件什麼?靜態庫通常由lib實用程序生成。一個dll的庫通常由鏈接器生成。
  3. 通過與正確的庫鏈接來解析Windows符號。
  4. 再次,通過鏈接到適當的庫(例如,kernel32.lib,gdi32.lib和user32。lib提供的三個DLL)。
  5. 它不是靜態鏈接的。你鏈接到圖書館。在DLL庫(例如上面列出的)的情況下,鏈接器使用它將一個記錄嵌入到可執行文件中,該文件告訴加載程序使用哪個DLL來解析這些符號。 .lib文件位於您安裝SDK的任何位置的lib子目錄中(通常類似於C:\Program Files\Microsoft SDKs\Windows\v6.0A。通常,SDK安裝程序將在必要時添加這些文件,因此您不必在從命令行或Visual中進行鏈接時明確指定該目錄。工作室
  6. 有幾個,雖然這是值得商榷的,他們是否真的有所改善的一個可能性是使用編譯告訴鏈接使用特定庫:

    的#pragma評論(LIB ,「ws2_32.lib」)

這是特別有用的如果它使用依賴於特定庫的函數的頭部。

+0

#2「誰在生成什麼.lib文件?」我的意思是,當我們將項目編譯爲.lib文件時,每個.cpp文件都由編譯器編譯爲.s文件,然後彙編器將每個.s文件轉換爲.obj。就是這樣,我們沒有將這些鏈接與任何東西鏈接,因此鏈接器未被激活。所以,我們擁有的是一堆* .obj文件。那麼最終的* .lib文件如何生成?誰生成它? – claws 2010-08-04 20:56:16

相關問題