如何从D DLL返回C结构体
How to return a C struct from a D DLL?
我有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
相关文章:
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- C++ 使用成员函数返回结构体指针属性的值
- 使用 boost::p ython,如何将结构体向量作为字典列表返回给 Python
- 如何使用其他函数返回的值为结构体成员赋值
- 使用 BOOST.python 从 C++ 返回结构体到 Python
- 如何使用结构体作为接口从函数返回指向数组的指针
- 如何从D DLL返回C结构体
- 调用返回结构体的c++ DLL函数
- 返回指向类定义的结构体的指针,多个作用域操作符
- 结构体的vector.size()将返回什么
- 类静态方法返回包含该类对象的结构体
- 按值返回结构体vs按引用返回结构体
- 当从固定结构体中存储的对象构建函数时,c++ lambda构建静态函数返回意外值
- 将返回值赋给结构体(c++)
- 从函数返回结构体时出现问题
- C/ c++在底层按值返回结构体
- 不能返回指向结构体的指针
- c++只赋值函数调用返回的结构体的一部分
- 如何从类库返回一个结构体数组到控制台应用程序
- c++从函数返回一个指向结构体的指针