链接到C++中的DLL——同样的代码适用于Visual Studio,但不适用于MinGW
Linking to DLL in C++ - same code works with Visual Studio, but not with MinGW
我正试图在MinGW项目中使用第三方dll;dll附带了一个.lib和一个.h文件。下面是我尝试做的一个简单的例子:
#include <iostream>
using namespace std;
extern "C" {
long __declspec(dllimport) _stdcall C843_Connect(long iBoardNumber);
}
int main(int argc, char* argv[]) {
cout << "Attempting to connect..." << endl;
long ID = C843_Connect(1);
if (ID<0) {
cout << "Connection failed!" << endl;
return 1;
}
cout << "Connection succesful! ID: " << ID << endl;
return 0;
}
函数声明直接取自头文件。该代码使用MinGW正常编译,但每次调用C843_Connect(long)
时,生成的程序都会崩溃。然而,当使用MS Visual Studio 2010编译时,完全相同的代码可以很好地运行。(我猜这个dll是用Visual Studio构建的,因为它附带了一些VS示例项目。)你知道可能出了什么问题,以及我如何让dll与MinGW一起工作吗?
编辑:我运行了程序和调试器,崩溃的结果是调用了一个错误的地址。以下是程序崩溃前的最后四行反汇编:
Address Hex dump Command
00401419 |. E8 B2300300 CALL 004344D0
0040141E |. C70424 010000 MOV DWORD PTR SS:[ESP],1
00401425 |. A1 68724700 MOV EAX,DWORD PTR DS:[477268]
0040142A |. FFD0 CALL EAX
第一个调用转到msvcrt.dll中的某个位置,第二个调用使程序崩溃。有人能理解这一点吗?
不幸的是,各种编译器在如何实现这些所谓的标准调用约定方面存在许多细微的差异。
我在让Borland C++编译器调用Microsoft DLL时遇到了类似的问题,尽管使用标准调用约定将接口定义为外部"C"。
在我的例子中,代码实际上运行了入口点,但返回时失败了,因为两个编译器无法就如何处理位于堆栈的返回地址达成一致。
就像,当用Microsoft c/c++编译器重新编译完全相同的代码时,你我的问题就消失了。
编辑:此页面有一个stdcall的低级描述,您可以使用它与MinGW编译器正在生成的汇编程序进行campare。
不同的编译器执行不同的名称篡改。您需要使用兼容的编译器编译所有C++项目,使其正确链接。
相关文章:
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 适用于 WebView2 旧版本的示例应用程序
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- __attribute__(优化(0))) 是否适用于"recursively"?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 使用一个参数的模板函数时出错(适用于 2)
- WinDBG适用于从Visual Studio 2015保存的转储,但不适用于任务管理器。显示异常代码"not found"
- 适用于Visual Studio 2017的CMake Multi-Project设置
- 在Visual Studio 2017上编译适用于Android的SDL2应用程序时缺少 libBox2D.so
- 试图在Visual Studio 6.0上编译PuTTY PSCP(适用于Windows)时出现C++错误RC2104
- 完全相同C++代码适用于Visual Studio,但不适用于Xcode
- Visual Studio 2010 与 2012 编译时性能和稳定性比较,适用于C++用户
- 正在安装适用于Visual Studio的C/C++的openCV 2.4
- 如何构建独立于编译器的C++库(适用于 Solaris Studio 和 gcc)
- GCC 奇怪的链接器错误.适用于Visual Studio 2010
- 模板专用化适用于 gcc,但不适用于 Visual Studio 10
- Xcode 6 的 Playground 功能适用于 Visual Studio 或其他使用 C++ 的 IDE?
- 链接到C++中的DLL——同样的代码适用于Visual Studio,但不适用于MinGW