如何从 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
我有 用 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