如何从 D DLL return C 结构?

How to return a C struct from a D DLL?

我有 用 D 编写的库,它编译为具有 C 接口的 DLL。 当我尝试 return a struct 时,我得到 undefined reference to 'fooFunc()'.

从 D 库 return C struct 的正确方法是什么


这是我的 D 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();

您应该将 return 值类型定义为 struct FooStruct 因为您的代码中没有 typedef 它。

在 C 结构中分配在堆栈中,您应该在堆内存中分配它并return指向它的指针以避免内存不一致。

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

你的代码几乎没有问题。

您缺少的是:C++ 代码中的 extern "C" FooStruct fooFunc();。和D一样,C++也需要开发者标注C函数。

进行此更改后,我轻松地编译并 linked 这两个:

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;
}

编译 & link:

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