- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我在 Qt Creator 中工作时尝试使用 MinGW 链接到 MSVC 编译的库时遇到了一个有趣的错误。链接器提示缺少符号,如 _imp_FunctionName
.当我意识到这是由于缺少外部“C”并修复它时,我还使用/FAcs 运行了 MSVC 编译器以查看符号是什么。原来是__imp_FunctionName
(这也是我在 MSDN 和不少大师博客网站上阅读的方式)。
我对 MinGW 链接器如何提示以 _imp
开头的符号感到非常困惑。 , 但可以很好地找到它,尽管它以 __imp
开头.一位深度编译器魔术师能否对此有所了解?我使用了 Visual Studio 2010。
最佳答案
这是在工作中相当直接的标识符装饰。 imp_
前缀由编译器自动生成,它导出一个函数指针,允许优化绑定(bind)到 DLL 导出。根据语言规则,imp_ 以前导下划线为前缀,这是必需的,因为它位于全局命名空间中并且由实现生成,并且不会出现在源代码中。所以你得到 _imp_
.
接下来发生的事情是编译器修饰标识符以允许链接器捕获声明不匹配。非常重要,因为编译器无法诊断跨模块的声明不匹配,并且在运行时自己诊断它们非常痛苦。
首先是 C++ 装饰,这是一个非常复杂的方案,支持函数重载。它会生成看起来很奇怪的名字,通常包括很多?和 @ 带有额外字符的参数和返回类型的字符,以便重载是明确的。然后是 C 标识符的修饰,它们基于调用约定。 cdecl 函数有一个前导下划线,一个 stdcall 函数有一个前导下划线和一个尾随 @n,允许在参数声明不匹配之前诊断它们不匹配堆栈。 64 位代码中没有 C 装饰,(幸运的是)只有一种调用约定。
所以你得到了链接器错误,因为你忘记指定 C 链接,链接器被要求将重修饰的 C++ 名称与轻度修饰的 C 名称相匹配。然后你用 extern "C"
修复它,现在你得到了 cdecl 的单个下划线,转为 _imp_
进入 __imp_
.
关于visual-c++ - _imp 和 __imp 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11236789/
当我在 Qt Creator 中工作时尝试使用 MinGW 链接到 MSVC 编译的库时遇到了一个有趣的错误。链接器提示缺少符号,如 _imp_FunctionName .当我意识到这是由于缺少外部“
环境: Windows 服务器 2012 R2 eclipse 月神 西格温 明格瓦 我正在构建一个 C++ 程序,它使用 LDAP(类似于 MSDN page)查询 Active Directory
我有一个简单的套接字程序,我正在尝试使用在 Win8 系统上的 mingw(两个最新版本)中运行的 g++ 进行编译。我遇到了常见的链接器错误 undefined reference to `__im
我是一名 UNIX 开发人员,负责帮助维护一些 Windows 软件,我正在查看 .DEF生成器同时修复错误。它不包括 __xmm , __real和 __imp - 来自导出的前缀符号。 我一直在努
好吧,我基本上继承了一堆我被告知要修复的代码,因为它在几个月前曾经可以工作,但目前还不行。该程序本身似乎充满了链接错误,我能够修复其中的一些错误。但是,我遇到了 LNK2019 Unresolved
我是一名优秀的程序员,十分优秀!