problemas al incrustar lua en c++

Estoy intentando incrustar el código lua en C++ y recibo un extraño error de compilación. Aquí está mi código:

#include <stdio.h>
extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}

int main() {
    lua_State *luaVM = luaL_newstate();
    if (luaVM == NULL) {
        printf("Error initializing lua!\n");
        return -1;
    }

    luaL_openlibs(luaVM);

    luaL_dofile(luaVM, "test.lua");

    lua_close(luaVM);

    return 0;
}

compilado con:

g++ -Wall -o embed -llua embed.cpp

y el error es:

g++ -Wall -o embed -llua embed.cpp
/tmp/ccMGuzal.o: In function `main':
embed.cpp:(.text+0x47): undefined reference to `luaL_loadfilex'
embed.cpp:(.text+0x72): undefined reference to `lua_pcallk'
collect2: error: ld returned 1 exit status

No estoy llamando luaL_loadfilex or lua_pcallk de mi código, lo que se presta a la suposición de que el problema no está en mi código, sino en lua mismo. ¿alguien tiene alguna idea aquí?

ACTUALIZACIÓN

Aquí está la información de mi versión:

$ lua -v
Lua 5.2.0  Copyright (C) 1994-2011 Lua.org, PUC-Rio

preguntado el 31 de julio de 12 a las 15:07

@MartinSchröder tenga en cuenta que esa también era mi pregunta. Decidí que, habiendo descubierto qué estaba causando ese problema (lualib no existe), era mejor hacer esto como una nueva pregunta y seguir editando esa. -

ah Lo siento, no me di cuenta de eso. -

4 Respuestas

En en lua 5.2.1 luaL_dofile es una macro que se declara así:

#define luaL_dofile(L, fn) \
    (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0))

en su versión de lua podría muy bien implementarse con luaL_loadfilex y lua_pcallk, y obtienes referencias indefinidas como dijo @Shahbaz.

Respondido 31 Jul 12, 15:07

Pre 5.1 respuesta: Según este sitio web, necesitas agregar -llualib después de -llua si incluye lauxlib.h y lualib.h:

g++ -Wall -o embed embed.cpp -llua -llualib

Noticias

Tonto, siempre debes vincular archivos/libs en el orden en que usan el otro. Si A usos B, debe mencionar A antes de B.

En tu caso, desde embed.cpp usos lua, entonces debes escribir:

g++ -Wall -o embed embed.cpp -llua

Respondido 31 Jul 12, 16:07

según esta respuesta, no hay lualib en lua >5.1. cuando agrego -llualib, me sale un nuevo error, haciendo una copia de seguridad de esto: /usr/bin/ld: cannot find -llualib - ewok

@ewok, ¿cuál es tu versión lua? - Shahbaz

@Shabaz, moví los enlaces, pero fue en vano. - ewok

@ewok, ¿obtienes exactamente el mismo error? Tratar nm en el archivo lib de lua y verifique si esos símbolos existen en él. - Shahbaz

@ewok, ¿lo hiciste? nm en el archivo lib de lua? - Shahbaz

En última instancia, el problema fue que las bibliotecas se nombran de manera diferente según la versión. Cuando se instala desde el repositorio, las bibliotecas se llaman liblua5.x y liblualib5.x, y por lo tanto se requería el siguiente comando:

g++ -Wall -o embed embed.cpp -llua5.2 -llualib5.2

Respondido el 12 de Septiembre de 12 a las 13:09

Puedes usar:

cc embed.cpp -o embed -llua -L../lua -I../lua -lm -ldl

Respondido 17 Feb 19, 19:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.