【问题标题】:MSVC 2015 GetComputerName unresolved external symbol issueMSVC 2015 GetComputerName 未解决的外部符号问题
【发布时间】:2018-01-26 09:11:01
【问题描述】:

共有三个动态链接库:A、B、C。

库 A 导出两个函数:system 命名空间中的 IsRemoteSession()GetComputerName()

库 B 与库 A 具有静态链接并使用这两个函数。没有链接错误。

库 C 与库 A 具有静态链接,并使用这两个函数。有一个链接错误:

LNK2019:调试和发布配置中未解析的外部符号“GetComputerName”。

B和C的项目属性相同。

MSVC 2008 中没有链接错误。

我发现的唯一一种解决方法是将 GetComputerName 重命名为其他名称。

还有其他人遇到过这个错误吗?

附: #undef GetComputerName 没有帮助。

【问题讨论】:

  • GetComputerName 也是 Windows API 调用的名称。与传递字符串参数的所有其他 Windows API 调用一样,它是扩展为 GetComputerNameAGetComputerNameW 的预处理器符号。您可能正在导出或导入与您认为的不同的符号。
  • 是的,我知道,但是:库 B 与库 A 有静态链接,并使用这两个函数。 没有链接错误。而#undef GetComputerName 也无济于事。
  • 尽管如此,根据提供的信息,这个问题是无法回答的。需要minimal reproducible example,理想情况下包括exact错误消息,以及来自LIB文件的DUMPBIN输出。
  • 我的猜测是 windows.h 的包含顺序起作用并在 B 和 A 中重命名您的所有 GetComputerName,但在 C 中没有。链接器找不到它,因为它被称为.something like GetComputerNameA or GetComputerNameW in A. 对于测试,您可以查看导出或尝试 C 中的 #define GetComputerNameAW
  • 这不是解决方案。如果您仅在库 A 中#undef GetComputerName,您仍在尝试在库 B 和 C 中导入错误的符号。您必须确保在所有 3 个位置使用相同的符号。还可以考虑使用push_macro/pop_macro 离开你找到的全局命名空间。

标签: c++ visual-studio winapi


【解决方案1】:

这是因为 windows.h 中的“#define”。

它在 A 和 B 库中将我所有的 GetComputerName 重命名为 GetComputerNameA 而不是 C。

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多