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