我正在使用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)
这些错误使我想到了几个问题。对于其中一些人,我认为我知道答案,但是如果我是对还是错,我需要确认。
这些Windows API函数在gdcmUtil.cpp中使用(因为它说gdcmUtil.obj)。因此,编译器将gdcmUtil.cpp编译为(例如)gdcmUtil.asm,然后由汇编程序将其组装为gdcmUtil.obj。由于在编译库时,我们不会生成任何exe文件。这些* .obj文件未与任何其他* .obj链接。因此,Windows API符号仍然是该模块的外部符号,因此无法解析。对?
谁在生成* .LIB文件?我的意思是编译器正在生成* .s文件,而汇编程序正在生成* .obj文件,而我们没有使用链接器。那么,我们从哪里获得* .lib文件?谁将所有* .obj文件打包到* .lib文件中?
Windows API应用程序(用C编写并使用Windows API的程序)如何进行编译?我的意思是,因为它是独立应用程序,这些WIN32 API符号如何解析?假设我已经编写了这样的程序,谁能告诉我成功构建应用程序需要什么?
我知道Windows API是在kernel32.dll,gdi32.dll,user32.dll中实现的(它们可能反过来导入诸如wsock32.dll的其他一些dll以用于网络API等),但问题是如何在Windows API中使用这些功能C程序中的函数。我的意思是如何针对这些DLL动态链接
在寻找链接器错误问题的答案的过程中。我发现必须将wsock32.lib(对于WinSock 1.1)或ws2_32.lib(对于WinSock 2)或snmpapi.lib添加到链接器输入。
现在,除了将* .lib文件添加到链接器输入文件之外,还有其他解决方案吗?因为每当我使用一些新的ITK库函数时,都会收到一个新的链接器错误。我必须到Google查找该特定符号(window api函数)所属的* .lib文件,然后将该* .lib文件添加到链接器输入中。这让我疯狂!有什么理智的办法吗?
lib实用程序生成。a 的库dll通常由链接器生成。libSDK 安装位置的子目录中(通常类似于C:\Program Files\Microsoft SDKs\Windows\v6.0A.lib)。通常 SDK 安装程序会在必要时添加这些文件,因此在从命令行或在 Visual Studio 中链接时不必显式指定该目录。有一些,但它们是否真的是一种改进还有待商榷。一种可能性是使用编译指示告诉链接器使用特定的库:
#pragma 注释(lib, "ws2_32.lib")
如果标头使用依赖于特定库的函数,这在标头中特别有用。