链接Windows API

cla*_*aws 5 dll winapi linker

我正在使用ITK库。当我使用该库编写示例程序时,出现了以下链接器错误。如我们所见,所有这些“未解决的”符号都是Windows API函数,并且这些Windows API函数是由ITK库而非我的程序使用的。

Error   1   error LNK2019: unresolved external symbol _SnmpUtilVarBindFree@4 referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" (?GetMacAddrSys@gdcm@@YAHPAE@Z)  C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error   2   error LNK2019: unresolved external symbol _SnmpUtilOidNCmp@12 referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" (?GetMacAddrSys@gdcm@@YAHPAE@Z) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error   3   error LNK2019: unresolved external symbol _SnmpUtilOidCpy@8 referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" (?GetMacAddrSys@gdcm@@YAHPAE@Z)   C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error   4   error LNK2019: unresolved external symbol _WSAStartup@8 referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" (?GetMacAddrSys@gdcm@@YAHPAE@Z)   C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error   5   error LNK2019: unresolved external symbol __imp__UuidCreate@4 referenced in function "private: static bool __cdecl gdcm::Util::GenerateUUID(unsigned char *)" (?GenerateUUID@Util@gdcm@@CA_NPAE@Z)  C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error   6   error LNK2019: unresolved external symbol _gethostbyname@4 referenced in function "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl gdcm::Util::GetIPAddress(void)" (?GetIPAddress@Util@gdcm@@CA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)  C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error   7   error LNK2019: unresolved external symbol _gethostname@8 referenced in function "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl gdcm::Util::GetIPAddress(void)" (?GetIPAddress@Util@gdcm@@CA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)    C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error   8   error LNK2019: unresolved external symbol _WSACleanup@0 referenced in function "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl gdcm::Util::GetIPAddress(void)" (?GetIPAddress@Util@gdcm@@CA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Run Code Online (Sandbox Code Playgroud)

这些错误使我想到了几个问题。对于其中一些人,我认为我知道答案,但是如果我是对还是错,我需要确认。

  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. Windows API应用程序(用C编写并使用Windows API的程序)如何进行编译?我的意思是,因为它是独立应用程序,这些WIN32 API符号如何解析?假设我已经编写了这样的程序,谁能告诉我成功构建应用程序需要什么?

  4. 我知道Windows API是在kernel32.dll,gdi32.dll,user32.dll中实现的(它们可能反过来导入诸如wsock32.dll的其他一些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库函数时,都会收到一个新的链接器错误。我必须到Google查找该特定符号(window api函数)所属的* .lib文件,然后将该* .lib文件添加到链接器输入中。这让我疯狂!有什么理智的办法吗?

Jer*_*fin 3

  1. 恩,那就对了。
  2. 谁在生成什么.lib 文件?静态库通常由lib实用程序生成。a 的库dll通常由链接器生成。
  3. 您可以通过链接正确的库来解析 Windows 符号。
  4. 再次,通过链接适当的库(例如,您提到的三个 DLL 的 kernel32.lib、gdi32.lib 和 user32.lib)。
  5. 它不是静态链接的。您链接到图书馆。对于 DLL 的库(例如上面列出的库),链接器使用它将记录嵌入到可执行文件中,告诉加载程序使用哪个 DLL 来解析这些符号。.lib 文件位于libSDK 安装位置的子目录中(通常类似于C:\Program Files\Microsoft SDKs\Windows\v6.0A.lib)。通常 SDK 安装程序会在必要时添加这些文件,因此在从命令行或在 Visual Studio 中链接时不必显式指定该目录。
  6. 有一些,但它们是否真的是一种改进还有待商榷。一种可能性是使用编译指示告诉链接器使用特定的库:

    #pragma 注释(lib, "ws2_32.lib")

如果标头使用依赖于特定库的函数,这在标头中特别有用。