我想在 D 中使用 LEAP Motion。
因此它没有C库,只有C++库。
我在命令下尝试了 SWIG 2.0.9。
swig -c++ -d -d2 leap.i
此命令输出Leap.d、Leap_im.d、Leap_wrap.cxx、Leap_wrap.h。
但是,我不知道如何在 D 中使用包装器,也找不到如何使用包装器。
显示链接错误以完整使用它。
如何在 D2 中使用这些包装器?
我可以在没有 Leap.cpp(Leap.dll 的来源)的情况下使用吗?
更新:
谢谢两位的回答。很抱歉因为忙所以回复晚了。
先说结论,我可以按照以下步骤在 Win64 上构建 Leap 示例代码。
- 通过上述命令输出包装器。
- 使用 VC2010 从 Leap_wrap.cxx、Leap_wrap.h 创建 x64 DLL,并导入 Leap.lib(x64)。
- 使用 dmd -c 编译 Leap.d 和 Leap_im.d。
- 使用 Leap.obj 和 Leap_im.obj 构建 LeapTest.d
所有命令如下。
swig -c++ -d -d2 leap.i
dmd -c Leap.d Leap_im.d -m64
dmd LeapTest.d Leap.obj Leap_im.obj -m64
execute LeapTest.exe (require x64 Leap.dll and Leap_wrap.dll)
我可以运行 Leap 程序。
但是程序crack onFrame事件回调。
我将在 x86 上重试并调查原因。
最佳答案
一些有用的链接(一些信息可能已经过时):
- http://klickverbot.at/blog/2010/11/announcing-d-support-in-swig/
- http://www.swig.org/Doc2.0/D.html
- http://www.swig.org/tutorial.html
我个人从未使用过 SWIG,但我根据对 SWIG 的一般知识猜测:
- Leap_wrap.cxx 是 C++ 源文件,它包装了在 extern(C) 调用中从目标库调用 C++ 函数
- Leap_wrap.h 是包含所有 extern(C) 包装器的头文件
- Leap_im.d 是基于 Leap_wrap.h 的 D 模块,列出了相同的 extern(C) 函数
- Leap.d 是 D 模块,它使用 Leap_im.d 作为实现并再现了类似于原始 C++ API 的 API。
所以在你的 D 代码中你想导入 Leap.d 模块。用你的 C++ 编译器将 Leap_wrap.cxx 编译成目标文件,并在链接阶段提供 D 目标文件、Leap_wrap.o 和目标库。这应该可以解决问题。
附言不需要 Leap.cpp 源。所有内容都直接从 Leap_wrap.cxx 链接到目标库二进制文件。
关于c++ - 如何在 Windows 上使用 C++ 中的 SWIG for D?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16505047/