如何从D DLL返回C结构体

How to return a C struct from a D DLL?

本文关键字:返回 结构体 DLL      更新时间:2023-10-16

我有D编写的库,它编译为带有C接口的DLL。当我尝试返回struct时,我得到undefined reference to 'fooFunc()'

从D库返回C struct的正确方法是什么?


这是我的DLL代码:

// Earlier in source code
struct FooStruct {
    int m = 0;
}
// ...
// In main()
export extern(C) FooStruct fooFunc() {
    return FooStruct();
}

下面是我的(c++)代码,它使用了上述代码的编译DLL:

// Header
typedef struct {
    int m = 0;
} FooStruct;
FooStruct fooFunc();
// ...
// In main()
FooStruct foo = fooFunc();

你的代码几乎没有什么问题。

你缺少的是:extern "C" FooStruct fooFunc();在你的c++代码。和D一样,c++也需要开发人员标记C函数。

一旦我做了这个改变,我很容易编译和链接这两个:

foo.d:

// Earlier in source code
struct FooStruct {
    int m = 0;
}
// ...
// In main()
export extern(C) FooStruct fooFunc() {
    return FooStruct();
}

foo.cpp:

#include <iostream>
// Header
typedef struct {
    int m;
} FooStruct;
extern "C" FooStruct fooFunc();
using namespace std;
int main() {
    FooStruct foo = fooFunc();
    cout << foo.m << endl;
    return 0;
}

编译,链接:

dejan@mrak$ dmd -c foo.d -offood.o
dejan@mrak$ g++ -o foocxx.o -c foo.cpp
dejan@mrak$ gcc -o foo food.o foocxx.o -lphobos2 -lstdc++
dejan@mrak$ ./foo 
0

你应该将返回值类型定义为struct FooStruct,因为你在代码中没有typedef

在C语言中,结构是在堆栈中分配的,你应该在堆内存中分配它,并返回指向它的指针,以避免内存不一致。

typedef struct mystruct {
    int varA;
    int varB;
} mystruct_t;
//...
mystruct_t *my_new_struct(void) 
{
    mystruct_t *ptr = calloc(sizeof(struct mystruct), 1);
    // check errors and do the job!
    return ptr;
}
// returned pointer must be freed when done