如何在 Visual C++ 2008 中链接静态库?

2024-04-22

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

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

MyApplication.obj:错误 LNK2019:无法解析的外部符号“__declspec(dllimport) int __cdecl MyStaticLibrary::accept(int,struct sockaddr *,int *)”

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

EDIT:

我认为有些答案是对的。该库称为 UDT,在主头文件中包含以下内容:

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

这是否意味着它不适合用作静态库?


你如何设置它来链接? 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 添加到您的项目中;如果您想将其用作动态库,则将其删除。 (需要添加到两个项目中。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Visual C++ 2008 中链接静态库? 的相关文章

随机推荐