2014-05-17 5 views
1

와 루아 라이브러리의 함수를 호출, 그래서 나는나는 루아 라이브러리 런타임 전화를 시도하고 dlsym을

static int my_new(lua_State *L) { 
    printf("test_new"); 
} 

LUALIB_API int luaopen_my(lua_State *L) { 
    static const luaL_Reg R[] = 
    { 
    { "new",      my_new }, 
    { NULL,       NULL } 
    }; 

    luaL_newmetatable(L,myNAME); 
    luaL_setfuncs(L,R,0); 
    lua_pushliteral(L,"version");     /** version */ 
    lua_pushliteral(L,MYVERSION); 
    lua_settable(L,-3); 
    lua_pushliteral(L,"__index"); 
    lua_pushvalue(L,-2); 
    lua_settable(L,-3); 
    return 1; 
} 

그래서 동적 라이브러리로 구축 C에서 루아 lib 디렉토리를 만들고, 내가 그 일을 전화를 시도하는 방법 :

void *handle; 
lua_CFunction fnc_call; 

handle = dlopen("mylib.so", RTLD_LOCAL | RTLD_LAZY); 
if (!handle) { 
    printf("error call lib"); 
    exit(-1); 
} 

fnc_call = (lua_CFunction) dlsym(handle, "luaopen_my"); 
if (fnc_call == NULL) { 
    printf("error call func"); 
    exit(-1); 
} 

luaL_requiref(L, "my", fnc_call, 1); 
lua_pop(L, 1); 

하지만 내가 사용하는 루아 코드를 호출 할 때 세그먼트 오류가 있습니다. 내 프로그램에서 LIB 루아를 호출하는 방법을

test = my.new() 

, 나는 그게 내 libs와 전화 일부 루아 경로와 루아 API를 내 LIB를 넣을 수 있습니다 알지만, dlopen을 사용하여 호출해야합니다.

감사합니다, 당신이 my_new에서 값을 반환하지 않기 때문에, 기능이 일부 개체 (임의의 가능성 매우 높음) 번호가에 반환이 있다는 루아를 알려주는 임의의 값을 반환하는 것을 내기

답변

2

스택. 이것은 사실이 아니기 때문에 루아가 리턴 값으로부터 스택을 지울 때 아무 것도 추가되지 않았더라도 스택에서 객체를 제거합니다. 따라서 스택에있는 것보다 많은 객체가 제거되어 메모리가 손상 될 수 있습니다.

return 0에서 my_new을 더하십시오.