我有用编写的库,它用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();
答案 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