我已经修复了我在这个问题中遇到的链接器错误,但现在我遇到了另一个问题。我通过调用createObject()
lua 来创建我的对象,并为一个新对象创建一个 boost::shared_ptr,将它添加到一个列表中,然后返回它。
在带有 mingw 的 Windows 上,当我在 lua 中进行更改时,这些更改不会应用于 C++ 对象。我的代码不会有问题,因为我在 Linux 上构建了相同的东西并且它运行良好。
ObjectPtr createObject(PlayerPtr player){
ObjectPtr obj(new Object(player));
window->world.objects.push_back(obj);
return obj;
}
bool setup(lua_State* luastate, Window* caller){
open(luastate);
// initialize some other classes here.
class_<Player, PlayerPtr> Player("Player");
Player.def_readwrite("playerColor", &Player::playerColor);
Player.def_readwrite("displayName", &Player::displayName);
class_<Object, ObjectPtr> Object("WorldObject");
Object.def_readwrite("health", &Object::health);
Object.def_readwrite("maxHealth", &Object::maxHealth);
Object.def_readwrite("mesh", &Object::mesh);
Object.def_readwrite("location", &Object::location);
Object.property("player", &Object::getPlayer, &Object::setPlayer);
Object.def("setOnDeath", &Object::setOnDeath);
module(luastate)[
vec3,
color,
Player,
WorldObject,
def("isWindowOpen", &isWindowOpen),
def("loadMesh", &MeshManager::LoadMesh),
def("createObject", &createObject),
def("createPlayer", &createPlayer),
];
window = caller;
}
ObjectPtr
和PlayerPtr
是 Object 和 Player 的 boost::shared_ptr,window
是一个静态的 Window 指针,和createPlayer()
不createObject()
带任何参数使用Player
代替Object
.
在 lua 中:
red = createPlayer()
red.playerColor = Color(255,0,0)
red.displayName = "Red"
obj = createObject(red)
obj.location = vec3(10,10,0)
print(obj.player.displayName)
导致“红色”被放入控制台。但在 C++ 中,该值只是“”。
我对其进行了调试,并且确实在 C++ 中创建了对象并将其添加到列表中,但是没有进行任何更改,因为所有变量都处于默认状态。
我认为这是 luabind 和 mingw 的问题,或者只是构建有问题,
我从默认构建设置中改变的唯一事情是我需要做两件事才能让它编译:我在 jamfile 中设置 LUA_PATH 指向 lua 所在的目录(而不是从环境变量中获取它)和我变了
#elif BOOST_PP_ITERATION_FLAGS() == 1
至
#else
#if BOOST_PP_ITERATION_FLAGS() == 1
因为mingw出于某种原因不喜欢(
...(是的,我确实在正确的位置添加了#endif)
更新:我也尝试过使用 msvc10,但仍然存在同样的问题。我还尝试针对我的 Linux 上相同版本的 boost 构建它。但无济于事。