문제

=== 편집 ===

문제는 실제로 이것보다 훨씬 간단합니다. 테이블을 취하는 래핑 함수는 문제를 일으킨다. luabind :: Object를 가져 와서 테이블 인수로 해당 함수를 호출하는 함수를 랩핑하면 GC가 유효하지 않은 무료 ()를 유발합니다. 내 컴파일 된 Luabind Dylib에는 LUA 기호가 있기 때문에 이것이 일종의 미친 컴파일/연결 문제라고 생각하기 시작했습니다 (해당 기호의 두 사본, 하나는 라이브러리에 있고 하나는 내 이진에 있습니다). 어쩌면 나는 LUA 정적 변수의 중복이 있을까요? 나는 여기서 빨대를 잡고 있을지도 모른다.

=== 편집 ===

Mac OS X 10.6에서 Luabind 0.9 및 GCC 4.2.1 사용

LUA 테이블에서 Default_Converter를 사용하는 데 문제가 될 수있는 것이 무엇인지 알 수 있습니다.

내 코드의 다양한 목록과 같은 유형, 특히 std :: 벡터에 대한 변환기를 정의하려고합니다. Default_Converter와 함께 테이블을 C ++ 메소드로 전달하면 LUA는 쓰레기 수집기가 호출되는 즉시 유효하지 않은 포인터에서 Free ()와 충돌합니다.

나는 아마도 간단한 것을 놓치고있을 것입니다. 그러나 나는 그것을 알아낼 수 없습니다.

감사!

* LUA 코드 *


function first ()
 -- Doesn't crash
 -- t = TestClass(1, 3)

 -- Crashes
 t = TestClass({1, 2, 3})

 print(t:get(0))
 print(t:get(1))
 print(t:get(2))
end

function second ()
 print("About to call collectgarbage...")
 collectgarbage()
 print("Done calling collectgarbage!")
end

function test ()
 first()
 second()
end

* C ++ 코드 *


#include <iostream>
#include <lua.hpp>

#include <luabind/luabind.hpp>
#include <luabind/operator.hpp>

using namespace std;
using namespace luabind;

namespace luabind {
 template<typename ListType>
 struct default_converter<std::vector<ListType> > : native_converter_base<std::vector<ListType> > {
   static int compute_score(lua_State* L, int index) {
     return lua_type(L, index) == LUA_TTABLE ? 0 : -1;
   }

   std::vector<ListType> from(lua_State* L, int index) {
     std::vector<ListType> list;
     for (luabind::iterator i(luabind::object(luabind::from_stack(L, index))), end; i != end; ++i)
       list.push_back(luabind::object_cast<ListType>(*i));

     return list;
   }

   void to(lua_State* L, const std::vector<ListType>& l) {
     luabind::object list = luabind::newtable(L);
     for (size_t i = 0; i < l.size(); ++i)
       list[i+1] = l[i];

     list.push(L);
   }
 };
}

class TestClass {
public:
 TestClass(std::vector<int> v) : m_vec(v) {}

 TestClass(int b, int e) {
   for (int i = b; i <= e; ++i)
     m_vec.push_back(i);
 }

 int get(size_t i) const {
   return m_vec[i];
 }

private:
 std::vector<int> m_vec;
};

int main(int argc, char** argv) {
 if (argc != 2) {
   cout << "usage: " << argv[0] << " <scriptname>" << endl;
   return -1;
 }

 std::string scriptName = argv[1];
 lua_State* L = (lua_State*) lua_open();
 luaL_openlibs(L);

 open(L);

 module(L)
 [
   class_<TestClass>("TestClass")
     .def(constructor<std::vector<int> >())
     .def(constructor<int, int>())
     .def("get", &TestClass::get)
 ];

 if (luaL_loadfile(L, scriptName.c_str()) || lua_pcall(L, 0, 0, 0)) {
   cout << "Script error: " << lua_tostring(L, -1) << endl;
   return -1;
 }

 call_function<void>(globals(L)["test"]);

 lua_close(L);
 return 0;
}
도움이 되었습니까?

해결책

그래, 나는 그것을 알아 냈다. Luabind는 구축 된 방식을 제외하고는 전혀 문제가 없었습니다. Mac OS X의 JAM 빌드 시스템은 정적 LUA 라이브러리가 Luabind 공유 라이브러리와 연결되어 최종 바이너리를 연결할 때 중복 기호 (및 정적 변수)가 발생합니다. 그것은 없었습니다 전체 LUA 라이브러리는 링크되어 있으므로 Liblua.a를 다시 연결해야합니다.

이 설명을 소금 한 알로 가져 가십시오. 그러나 그것은 나의 최선의 추측입니다. 나는 Mac OS X 링커의 작동 방식에 대한 전문가가 아닙니다. Luabind를 정적으로 만들 때 모든 것이 잘 작동한다는 것을 알고 있습니다.

따라서 Mac에 Lubabind를 구축하는 사람이라면 정적으로 구축하십시오. @Executable_Path가 잘못되었다는 사실과 같이 JAM이 구축 된 공유 LIB에는 다른 문제가 있습니다. 정적 빌드는 단순했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top