sus*_*sus 5 dll linker mingw visual-c++
当我在Qt Creator中使用MinGW尝试链接到MSVC编译的库时,我遇到了一个有趣的错误.链接器抱怨缺少符号_imp_FunctionName.当我意识到它是由于缺少extern"C"并修复它时,我还使用/ FAcs运行MSVC编译器以查看符号是什么.事实证明,这是__imp_FunctionName(这也是我在MSDN和相当多的大师博客网站上阅读的方式).
我对MinGW链接器如何抱怨开头的符号感到非常困惑_imp,但是尽管它开头就能很好地找到它__imp.深度编译魔术师可以对此有所了解吗?我使用Visual Studio 2010.
Han*_*ant 22
这是工作中相当直接的标识符装饰.该imp_前缀是自动生成的编译器,它导出的函数指针可以优化结合DLL导出.根据语言规则,imp_以前导下划线为前缀,因为它位于全局名称空间中并且由实现生成,因此不会出现在源代码中.所以你得到了_imp_.
接下来发生的事情是编译器修饰标识符以允许链接器捕获声明不匹配.非常重要,因为编译器无法诊断模块之间的声明不匹配,并且在运行时自己诊断它们是非常痛苦的.
首先是C++装饰,一个支持函数重载的非常复杂的方案.它产生了非常奇怪的名字,通常包括很多?和带有参数和返回类型的额外字符的@字符,以便重载是明确的.然后是C标识符的装饰,它们基于调用约定.cdecl函数有一个前导下划线,stdcall函数有一个前导下划线和一个尾随@n,它允许在它们使堆栈不平衡之前诊断参数声明不匹配.在64位代码中没有C装饰,(祝福)只有一个调用约定.
因此,您忘记指定C链接时出现了链接器错误,要求链接器将装饰较重的C++名称与温和装饰的C名称进行匹配.然后你修复了它extern "C",现在你得到了cdecl的单个添加下划线,变成_imp_了__imp_.
| 归档时间: |
|
| 查看次数: |
2979 次 |
| 最近记录: |