【问题标题】:How to link a static library in Visual C++ 2008?如何在 Visual C++ 2008 中链接静态库?
【发布时间】:2009-06-14 00:14:27
【问题描述】:

我的 VC++ 解决方案包括两个项目,一个应用程序 (exe) 和一个静态库。

两者都编译正常,但无法链接。我使用的静态库中的每个函数都收到“未解析的外部符号”错误。它们看起来像这样:

MyApplication.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) int __cdecl MyStaticLibrary::accept(int,struct sockaddr *,int *)"

应用程序找到的 .lib 很好,所以这不是问题。我在想“dllimport”是问题所在——为什么当我试图构建一个静态库时它会在那里?应用程序和库都使用“多线程 (/MT)”运行时库,而不是“多线程 DLL (/MD)”。

编辑:

我认为有些答案是正确的。该库称为 UDT,在主头文件中有这个:

#ifdef UDT_EXPORTS
   #define UDT_API __declspec(dllexport)
#else
   #define UDT_API __declspec(dllimport)
#endif

这是否意味着它不打算用作静态库?

【问题讨论】:

  • 所以神秘的是 __declspec(dllimport) 来自哪里——大概是库的 .h 文件,但它是如何到达那里的?一些宏变得疯狂?你好吗.h...?

标签: c++ visual-studio visual-c++


【解决方案1】:

你是如何设置链接的?你的 MyApplication 和 MyStaticLibrary::accept 的头文件是什么样的?

如果您在同一个解决方案文件中有两个项目,将其设置为链接的最佳方法是右键单击解决方案文件->属性,然后将库设置为应用程序的依赖项。 Visual Studio 将自动处理链接,并确保在您构建应用程序时库构建是最新的。

这个错误听起来有点像你在你的头文件中将它定义为一个 DLL 导入/导出。

编辑: 是的,这就是问题所在。您可能首先将其创建为动态库? (或者写它的人。)

有几个选项。

1) 您可以删除所有这些内容,以及代码中的任何 UDT_API 修饰符。

2) 你可以删除那些东西并添加这一行:

#define UDT_API

3) 更健壮的解决方案是将其更改为:

#ifdef  UDT_STATIC
    #define UDT_API
#else
    #ifdef UDT_EXPORTS
       #define UDT_API __declspec(dllexport)
    #else
       #define UDT_API __declspec(dllimport)
    #endif
#endif

然后,当您想将预处理器指令UDT_STATIC 用作静态库时,将其添加到您的项目中,如果您想将其用作动态库,则将其删除。 (将需要添加到两个项目中。)

【讨论】:

  • 查看我上面的编辑以获取更多信息,我认为这就是原因。
  • 嗯,使用上面的健壮解决方案仍然会产生相同的错误,只是现在 __declspec(dllexport) 是 __declspec(dllimport)。我可能只需要咬紧牙关,彻底检查我的解决方案以使用 DLL。
  • 您是否在两个项目的预处理器指令中都添加了 UDT_STATIC 并重新构建?
  • 另一件事。在库中,确保将项目更改为静态库。即转到库的项目设置,转到 Genera,然后将“配置类型”更改为静态库。然后转到预处理器定义并删除 _USRDLL 定义。
  • 哦,哇,我忘了在应用程序项目中添加 UDT_STATIC。终于链接成功了,谢谢杰拉德!我真的很感谢你的帮助,我自己永远也想不通。
【解决方案2】:

由于您使用的是套接字,请确保将 WS2_32.lib 添加到项目的附加依赖项中。

【讨论】:

  • 你通常会因为不添加库而得到这样的错误。那很奇怪。你确定你有它在额外的依赖项下吗?也可以尝试将它放在通用库部分。
  • 抱怨的是他的类方法accept,而不是winsock的accept函数。
【解决方案3】:

看起来静态库中的导出函数有错误的调用约定。导出函数的头文件长什么样?

好的,所以函数使用 UDT_API 作为前缀。如果您只是创建一个静态 .lib 来链接,它们不应该这样做。

另一种方法是更改​​ lib 以创建 dll。因此,您使用 dll 创建静态链接。唯一的问题是您必须为您的应用程序提供 dll。仍然不是一个糟糕的解决方案,因为它使您能够在库中进行修复。

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 2011-01-03
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多