作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有用D 编写的库,它可以编译为带有C 接口(interface)的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"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
关于c++ - 如何从 D DLL 返回 C 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33174826/
我是一名优秀的程序员,十分优秀!