【问题标题】:How to return a C struct from a D DLL?如何从 D DLL 返回 C 结构?
【发布时间】:2015-10-16 16:01:36
【问题描述】:

我有用 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();

【问题讨论】:

  • 您将 extern ("C") 放入 D 代码中,但未放入 C++ 代码中。怎么会?

标签: c++ c dll struct d


【解决方案1】:

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

您缺少的是: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;
}

编译和链接:

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

【讨论】:

  • 奇怪,因为他是用 D 代码写的。这几乎是一个错字问题......!
  • 也许他认为 C++ 不需要 extern "C" 。
【解决方案2】:

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

【讨论】:

  • 我已经在 C 标头中 typedefed FooStruct。我的 D 代码中也需要Typedef 吗?我认为这不会有任何作用。
  • “您应该将返回值类型定义为 struct FooStruct 因为您没有在代码中对其进行 typedef。” 不,这在 C++ 中是不必要的。
  • “在 C 结构中分配在堆栈中” 不一定。无论如何,这是 C++,自 1985 年以来就没有结构。
  • “在 C 结构中分配在堆栈中”。不,它们不是,它们被分配到你说的地方。无论如何在堆栈上返回一个结构是好的,它将被复制(你正在考虑返回指向本地结构的指针 - 这是一个非常糟糕的事情)
  • “你应该在堆内存中分配它并返回一个指向它的指针以避免内存不一致”完全废话。
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
相关资源
最近更新 更多