我正在尝试在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中的某个地方,第二个调用崩溃了程序。任何人都可以理解这个吗?
答案 0 :(得分:1)
不幸的是,各种编译器如何实现这些所谓的标准调用约定有很多subtle differences。
我有类似的问题让Borland C ++编译器调用Microsoft DLL,即使使用标准调用约定将接口定义为extern“c”。
在我的情况下,代码实际上运行了入口点但是在返回时失败了,因为两个编译器无法就如何处理堆栈的返回地址达成一致。
就像,当使用Microsoft c / c ++编译器重新编译完全相同的代码时,我的问题就消失了。
编辑:此page具有stdcall的低级描述,您可以将其用于与MinGW编译器生成的汇编程序一起使用。
答案 1 :(得分:0)
不同的编译器执行不同的名称修改。您需要使用兼容的编译器编译所有C ++项目,以便正确链接。