ITK library链接Windows的API" /> ITK library链接Windows的API - 源码之家" />

我使用的是ITK library链接Windows的API

问题描述:

。当我使用这个库编写示例程序时,我遇到了以下链接器错误。正如我们所看到的,这些所有“未解决”的符号都是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

  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