在C ++中链接到DLL - 相同的代码适用于Visual Studio,但不适用于MinGW

时间:2012-02-12 23:11:12

标签: c++ visual-studio dll 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中的某个地方,第二个调用崩溃了程序。任何人都可以理解这个吗?

2 个答案:

答案 0 :(得分:1)

不幸的是,各种编译器如何实现这些所谓的标准调用约定有很多subtle differences

我有类似的问题让Borland C ++编译器调用Microsoft DLL,即使使用标准调用约定将接口定义为extern“c”。

在我的情况下,代码实际上运行了入口点但是在返回时失败了,因为两个编译器无法就如何处理堆栈的返回地址达成一致。

就像,当使用Microsoft c / c ++编译器重新编译完全相同的代码时,我的问题就消失了。

编辑:page具有stdcall的低级描述,您可以将其用于与MinGW编译器生成的汇编程序一起使用。

答案 1 :(得分:0)

不同的编译器执行不同的名称修改。您需要使用兼容的编译器编译所有C ++项目,以便正确链接。