我的 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(使用前将#替换为@)