如何从D DLL返回C结构?

时间:2015-10-16 16:01:37

标签: c++ c dll struct d

我有用编写的库,它用C接口编译成DLL。 当我尝试返回struct时,我会收到undefined reference to 'fooFunc()'

从D库中返回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();

2 个答案:

答案 0 :(得分:2)

您的代码几乎没有任何问题。

您缺少的是:C ++代码中的extern "C" FooStruct fooFunc();。与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;
}

编译&amp;链接:

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

答案 1 :(得分:-1)

您应该将返回值类型定义为 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