VS2010下使用swig将c++和lua连接起来

来源:互联网 发布:知而不争的争读音 编辑:程序博客网 时间:2024/04/29 07:52

 swig是一个开发工具,用来帮助使用C/C++编写的软件和各种脚本语言进行嵌入连接。这里我只说下我这几天自己使用swig连接lua的经验吧。

 首先去官网下载swig:www.swig.org,注意在windows平台下下载的是swigwin版本的。下载下来直接解压缩就可以了。然后配置一下你的环境变量,把你的swigwin的路径添加进path里面去。查看swig的环境变量是否设置好了,可以在dos下运行 “swig”命令,看提示即可,提示“Must specify an input file......”即表示环境变量设置成功了。

  要想使用swig的功能,首先你得有一个接口文件,一般是XXX.i形式的,也就是后缀是.i。这个接口文件一般是自己手写的,因为涉及到在C++和脚本语言里面对象生命周期的问题,如果自动生成的话可能有比较大的风险。具体写法可以网上查找,有很多的文档可以参考,或者在你下载的swig解压缩包里::\swigwin-2.0.12\swigwin-2.0.12\Examples,这个目录下有很多例子,各种脚本的都有,其实我觉得看这些就够了,有不懂的地方就上网查好了。我需要用的是lua,所以我就研究了lua下的各种例子。

  接下来去官网下载lua:www.lua.org,注意这里最好下载5.1或者5.1之前的版本,目前swig尚不支持5.2或者更高的版本。这里要说一下,官网上下载的是压缩包,解压缩之后是需要你自己手动生成lua的.lib文件的。打开VS2010,新建Win32 Console Application(Win32控制台程序),选择static library,去掉下面的预编译头的勾,然后将你下载下来的lua目录下的src里面的所有文件全部添加到你新建的工程里面,编译即可。如果有错,可能是你的工程的设置不对。

 如果你下载的是lua的安装程序,那就不用自己生成lib文件了,安装完成了里面都有,一般是两个:lua51.lib和lua5.1.lib。

 接下来就是生成DLL。假设我们现在有自己写的example.h、example.cpp和example.i文件。新建Win32 Console Application(Win32 控制台程序),选择DLL,下面的选择Empty Property,点击完成。在头文件里面添加:example.h,lua.h,lauxlib.h,luaconf.h,注:如果你的lua的lib文件是手动生成的,这里就需要把这3个lua相关的头文件手动添加进来;如果是安装版本的,配置如下: 工程->属性: C/C++ : Additional Include Directories:E:\lua\5.1\include;     Precompiled Headers: Not Using Precompiled Headers,去掉“StdAfx.h”; Linker: General->Enable Incremental Linking: 选中 No(/INCREMENTAL:NO);  Input->Additional Dependencies: 添加lua51.lib,lua5.1.lib;    工程的Configuration Properties: General 确认: Configuration Type:DLL, Character Set: Use Unicode Characer Set. 最后 右击 example.i文件->Propertites:Configuration Propertites-> ITem Type:选中 Custom Build Tool,然后在Custom Build Tool-> Commond Line写:swig.exe -c++ -lua%(FullPath). Outputs里面写:%(InputName)_wrap.cxx;%(Outputs)

  这样,所有的配置就算全部完成了,编译,生成example.dll.

 下面写一个test.lua文件测试swig是否使用成功了。test.lua的内容如下:

if string.sub(_VERSION,1,7)=='Lua 5.0' then

lib=load.lib('example.dll', 'luaopen_example')

assert(lib) ()

else

require('example')

end


x=42

y=105

g=example.add(x,y)

print("The example of",x,"and",y,"is",g)


print("Foo=", example.Foo)

example.Foo = 3.1415926

print("Foo=", example.Foo)

0 0
原创粉丝点击