この質問で発生したリンカー エラーを修正しましたが、別の問題が発生しています。lua を呼び出してオブジェクトをcreateObject()
作成すると、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
ルアで:
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 の問題か、単にビルドの問題だと思いますが、
デフォルトのビルド設定から変更したのは、コンパイルするために必要だった 2 つのことだけでした。jamfile で LUA_PATH を設定して、lua が入っているディレクトリを指すようにしました (環境変数から取得するのではなく)。私が変更され
#elif BOOST_PP_ITERATION_FLAGS() == 1
に
#else
#if BOOST_PP_ITERATION_FLAGS() == 1
(
mingwは何らかの理由で好きではなかったので...(そして、はい、正しい場所に#endifを追加しました)
更新: msvc10 も使用してみましたが、まだ同じ問題があります。また、Linux にある同じバージョンのブーストに対してビルドしようとしました。しかし、役に立たない。