lua编译笔记

lua编译笔记

今天玩了一把脚本,玩完的感觉是真的好稀饭脚本啊。


1、编译lua注意的总结
lua的项目默认是用在linux上用bjam编译,这点很爽。如果要在windows上编译,有两种方式:
a)用vs的命令行进入lua根目录,执行“etc\luavs.bat”即可,执行成功后会在src目录下生成以下三个文件:
    lua.exe
    lua.lib
    lua.dll
b)手动建立项目文件
自己新建一个静态库或动态库,将根目录下的src文件夹下所有文件拉进来,删除lua.c\luac.c这2个目录即可。注意需要设置编译选项中的字符集为“使用多字节字符集”,不然lua库运行时初始化会崩溃。

今天先用的第二个方式编译,一切正常,但是运行的时候发现初始化lua库的时候程序崩溃,跟踪发现问题出在lua_lib这个函数中,不是很得要领。后来尝试用第一种方式,才没有崩溃。比较发现需要设置编译选项中的字符集为“使用多字节字符集”。

luavs.bat内容如下:
cd src
cl /O2 /W3 /c /DLUA_BUILD_AS_DLL l*.c
del lua.obj luac.obj
link /DLL /out:lua51.dll l*.obj
cl /O2 /W3 /c /DLUA_BUILD_AS_DLL lua.c
link /out:lua.exe lua.obj lua51.lib
cd ..

当然手动编译为dll的时候需要设置编译选项“LUA_BUILD_AS_DLL ”

2.编译luabind
编译luabind的时候,没耐心看官方说明文档,直接拉到vs中编译。当然还是看了下源文件的bjam的相关文件,没有发现有什么特殊的地方需要注意。所以直接编译,直接通过。

总结下,碰到这些开源项目没有vs工程文件,编译说明不像ogre那么全,第一感觉就是怕麻烦。其实那些开源社区的贡献者是非常聪明的人,并不会给我添多少麻烦,如果我非常周折还是有编译问题,说明我走弯路了,得静下来考虑。

3.luabind、luaplus、tolua++。。。
没有找到比较文档,中文有说luabind需要boost所以如何如何的,被我无视掉。所以优劣再说了。luabind是官方一个wiki中介绍的。luplus是武侠使用的,tolua是cegui使用的。

4.脚本赏析
这是脚步:

-- Lua script for test program.

print( 
'Hello from LUA!' )

app 
= getApplication()

app:setBackgroundColour( ColourValue( 
00, .25 ) )

camera 
= app:getCamera()

camera:setPosition( Vector3(
0,100,500) )

camera:lookAt( Vector3(
0,0,0) )

camera:setNearClipDistance( 
5 )

= app:createEntity( 'Ninja''ninja.mesh' )

e:setDisplaySkeleton( 
true )

rootNode 
= app:getRootNode()

child 
= rootNode:createChildSceneNode( 'NinjaNode' )

child:attachObject( e )

child:yaw( 
180 )

child:setPosition( Vector3.ZERO )

= app:createEntity( 'floor''floor' )

e:setMaterialName( 
'Examples/GrassFloor' , 'Autodetect' )

child 
= rootNode:createChildSceneNode( 'FloorNode' )

child:attachObject( e )

这是绑定ogre函数的代码:

void bindVector3( lua_State* L )
{
    module(L)
        [
            class_
<Vector3>"Vector3" )
            .def(tostring(self))
            .def_readwrite( 
"x"&Vector3::x )
            .def_readwrite( 
"y"&Vector3::y )
            .def_readwrite( 
"z"&Vector3::z )
            .def(constructor
<>())
            .def(constructor
<Vector3&>())
            .def(constructor
<Real, Real, Real>())
            .def(
"absDotProduct"&Vector3::absDotProduct)
            .def(
"crossProduct"&Vector3::crossProduct )
            .def(
"directionEquals"&Vector3::directionEquals )
            .def(
"distance"&Vector3::distance )
            .def(
"dotProduct"&Vector3::dotProduct )
            .def(
"getRotationTo"&Vector3::getRotationTo )
            .def(
"isZeroLength"&Vector3::isZeroLength )
            .def(
"length"&Vector3::length )
            .def(
"makeCeil"&Vector3::makeCeil )
            .def(
"makeFloor"&Vector3::makeFloor )
            .def(
"midPoint"&Vector3::midPoint )
            .def(
"normalise"&Vector3::normalise )
            .def(
"nornaliseCopy"&Vector3::normalisedCopy )
            .def(
"perpendicular"&Vector3::perpendicular )
            .def(
"positionCloses"&Vector3::positionCloses )
            .def(
"positionEquals"&Vector3::positionEquals )
            
//.def("ptr", &Vector3::ptr )
            .def("randomDeviant"&Vector3::randomDeviant )
            .def(
"reflect"&Vector3::reflect )
            .def(
"squaredDistance"&Vector3::squaredDistance )
            .def(
"squaredLength"&Vector3::squaredLength )

            
// Operators

            .def( self 
+ other<Vector3>() )
            .def( self 
- other<Vector3>() )
            .def( self 
* other<Vector3>() )
            .def( self 
* Real() )
        ];

    LUA_CONST_START( Vector3 )
        LUA_CONST( Vector3, ZERO);
    LUA_CONST( Vector3, UNIT_X );
    LUA_CONST( Vector3, UNIT_X);
    LUA_CONST( Vector3, UNIT_Y);
    LUA_CONST( Vector3, UNIT_Z);
    LUA_CONST( Vector3, NEGATIVE_UNIT_X);
    LUA_CONST( Vector3, NEGATIVE_UNIT_Y);
    LUA_CONST( Vector3, NEGATIVE_UNIT_Z);
    LUA_CONST( Vector3, UNIT_SCALE);
    LUA_CONST_END;
}

编译运行后的结果:
lua编译笔记_第1张图片

你可能感兴趣的:(lua编译笔记)