1

我想在 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 示例代码。

  1. 通过上述命令输出包装器。
  2. 使用 VC2010 从 Leap_wrap.cxx、Leap_wrap.h 创建 x64 DLL,并导入 Leap.lib(x64)。
  3. 使用 dmd -c 编译 Leap.d 和 Leap_im.d。
  4. 使用 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 程序。
但是程序catch onFrame 事件回调。
我将在 x86 上重试并调查原因。

4

2 回答 2

2

一些有用的链接(一些信息可能已经过时):

我个人从未使用过 SWIG,但我的猜测是基于对 SWIG 的一般知识:

  • Leap_wrap.cxx 是 C++ 源文件,它将目标库中对 C++ 函数的调用包装在 extern(C) 调用中
  • Leap_wrap.h 是列出所有 extern(C) 包装器的头文件
  • Leap_im.d 是基于 Leap_wrap.h 的 D 模块,列出了相同的 extern(C) 函数
  • Leap.d 是使用 Leap_im.d 作为实现并再现类似于原始 C++ 的 API 的 D 模块。

所以在你的 D 代码中你要导入 Leap.d 模块。使用 C++ 编译器将 Leap_wrap.cxx 编译为目标文件,并在链接阶段提供 D 目标文件、Leap_wrap.o 和目标库。这应该够了吧。

PS Leap.cpp 源应该不需要。所有东西都直接从 Leap_wrap.cxx 链接到目标库二进制文件。

于 2013-05-13T09:39:35.530 回答
0

转到 IRC,FreeNode 或 OFTC,频道 #D。为了帮助您,我们必须查看这些文件中的内容。我的第一个猜测是您必须将 D 文件和 C++ 文件都编译为目标文件,并将它们链接在一起。我想 SWIG 会将 C++ API 扁平化为一堆 C 函数,这可能就是 Leap_wrap.cxx 所做的。

如果 LEAP API 并不复杂(即只是一堆简单的 C++ 类),则可以直接与它交互。在此处阅读更多信息:http: //dlang.org/cpp_interface.html

于 2013-05-13T08:15:19.577 回答