2011-02-26 13 views
6

Quiero escribir un C++ - Programa que puede interactuar/llamar a Lua-scripts durante la ejecución. Un concepto clave del programa es la independencia completa de la plataforma, pero parece que no puedo encontrar una Lua-build que realmente ofrezca algo así.Incrustar Lua en C++

Las versiones de Lua que encontré hasta ahora están basadas en variables de entorno o bibliotecas específicas como .lib, .dll o .so. El Lua-source oficial de lua.org tampoco es lo que estoy buscando, ya que define una función principal ...

¿Hay un caso simple - mejor sería algo como sqlite-amalgamation - Lua-intérprete para C/C++ que no tiene ninguna de estas dependencias?

Respuesta

7

lua.c contiene main y define el punto de entrada para una aplicación de consola. Si lo quitas del proyecto, lo que queda es una biblioteca autónoma o biblioteca dinámica, si lo prefieres, está bien.

+0

¡Gracias por la respuesta! Recién noté que lua.c (intérprete independiente) y luac.c (Lua-to-Bytecode-Compiler) contienen un main - un poco raro que la fuente no esté separada en diferentes carpetas ... – MFH

+0

@MFH, esta organización es bastante típico de los proyectos clásicos basados ​​en archivos de pantalla. Tenga en cuenta la edad general de Lua. Makefile construye (según la plataforma) una biblioteca estática y dinámica desde el núcleo, luego compila lua.c y luac.c vinculados a ellos según corresponda. – RBerteig

+0

aha, sinceramente, aunque usé MAKEFILES un poco, nunca me encariñé con ellos y siempre dividía las aplicaciones en diferentes carpetas ... – MFH

4

Lo siguiente es lo que yo uso como un punto de partida para mis proyectos (he encontrado algo similar hace un tiempo y lo adaptó para que pueda cambiar más rápido):


El archivo de script lua:

-- Start 
    -- Script: myscript.lua 
    print("this is lua") 
    -- End 

El archivo C:

#include <stdlib.h> 
    #include <stdio.h> 
    #include <lua.h> 
    #include <lauxlib.h> 
    #include <lualib.h> 

    int main(void) { 
      static const luaL_reg lualibs[] = { 
        { "base",  luaopen_base }, 
        { NULL,   NULL } 
      }; 

      static void openlualibs(lua_State *l) { 
        const luaL_reg *lib; 

        for (lib = lualibs; lib->func != NULL; lib++) { 
          lib->func(l); 
          lua_settop(l, 0); 
        } 
      } 

      lua_State *l; 
      l = lua_open(); 
      openlualibs(l); 

      printf("now calling lua\n\n"); 
      lua_dofile(l, "myscript.lua"); 
      printf("\ndo something else\n\n"); 

      lua_close(l); 
      return 0; 
    } 

Puede usar esto libremente como base para sus proyectos.

2

Para una compilación de amalgama de un solo archivo del núcleo de Lua y el intérprete independiente, consulte el archivo etc/all.c en el kit de origen oficial. Ciertamente puede usarlo como base para su propia fusión, quizás eliminando la referencia al lua.c en la última línea.

Muchas aplicaciones más grandes que integran Lua lo hacen simplemente agregando los archivos fuente centrales al proyecto. Esto es particularmente efectivo si la aplicación tiene la intención de no permitir que el código de extensión cargue módulos compilados de los archivos .dll o .so. Si su aplicación permitirá módulos compilados, generalmente es mejor vincularse con la biblioteca compartida para el núcleo, de modo que la aplicación y los módulos cargados puedan hacer referencia a los símbolos desde una única instancia de la biblioteca central. Tenga en cuenta que la inclusión accidental de múltiples instancias del núcleo Lua casi garantiza que producirá síntomas muy difíciles de diagnosticar.