如何在Windows上使用C ++从C ++开始使用SWIG?

时间:2013-05-12 07:12:23

标签: c++ windows swig d leap-motion

我想在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. 使用Leap_wrap.cxx,Leap_wrap.h中的VC2010创建x64 DLL,然后导入Leap.lib(x64)。
  3. 使用dmd -c编译Leap.d和Leap_im.d。
  4. 使用Leap.obj和Leap_im.obj构建LeapTest.d
  5. 所有命令都在下面。

    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 Program 但程序破解onFrame事件回调 我将再次尝试x86并调查原因。

2 个答案:

答案 0 :(得分:2)

很少有用的链接(某些信息可能已过时):

我从未亲自使用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。

因此,在您的D代码中,您要导入Leap.d模块。使用C ++编译器将Leap_wrap.cxx编译为目标文件,并在链接阶段提供D对象文件,Leap_wrap.o和目标库。这应该可以解决问题。

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

答案 1 :(得分:0)

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

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