2010-11-10 9 views
5

Tengo el siguiente programa trivial Lua, que he copiado de la programación del libro En Luano se puede vincular un programa Lua mínima

#include <stdio.h> 
#include <lua.h> 
#include <lauxlib.h> 
#include <lualib.h> 
int main (void) 
{ 
    char buff[256]; 
    int error; 
    lua_State *L = luaL_newstate(); /* opens Lua */ 
    luaL_openlibs(L); /* opens the standard libraries */ 
    while (fgets(buff, sizeof(buff), stdin) != NULL) 
    { 
     error = luaL_loadbuffer(L, buff, strlen(buff), "line") || 
     lua_pcall(L, 0, 0, 0); 

     if (error) 
     { 
      fprintf(stderr, "%s", lua_tostring(L, -1)); 
      lua_pop(L, 1); /* pop error message from the stack */ 
     } 
    } 
    lua_close(L); 
    return 0; 
} 

mi medio ambiente es cywin

mi archivo de maquillaje se ve así:

CC=gcc 
INCLUDE='-I/home/xyz/c_drive/Program Files/Lua/5.1/include' 
LINKFLAGS='-L/home/xyz/c_drive/Program Files/Lua/5.1/lib' -llua51 

li.o:li.c 
    $(CC) $(INCLUDE) -c li.c 

main:li.o 
    $(CC) -o main $(LINKFLAGS) li.o 

clean: 
    rm *.o 
    rm main 

Mi/home/xyz C_DRIVE/archivos de programa/Lua/5.1 directorio// lib contiene lua5.1.dll lua5.1.lib lua51.dll y lua51.lib

tratando de construir mi objetivo principal que estoy consiguiendo los errores siguientes:

li.o:li.c:(.text+0x35): undefined reference to `_luaL_newstate' 
li.o:li.c:(.text+0x49): undefined reference to `_luaL_openlibs' 
li.o:li.c:(.text+0xaf): undefined reference to `_luaL_loadbuffer' 
li.o:li.c:(.text+0xd9): undefined reference to `_lua_pcall' 
li.o:li.c:(.text+0x120): undefined reference to `_lua_tolstring' 
li.o:li.c:(.text+0x154): undefined reference to `_lua_settop' 
li.o:li.c:(.text+0x167): undefined reference to `_lua_close' 

alguna idea acerca de lo que podría estar haciendo mal aquí?

+0

¿Cómo construiste lua51.lib? Si la lib se compiló con el compilador de C++, entonces tu programa también debería compilarse (y vincularse) con el compilador de C++. – torus

+0

He descargado la versión bin del sitio web de lua ... El compilador que uso es gcc (no g ++) .....Intentaré descargar el código fuente y compilarlo – JohnP

+0

Existen varias versiones binarias diferentes, compiladas con diferentes compiladores. ¿Qué paquete específico obtuviste? – Mud

Respuesta

9

El problema es que ha nombrado las bibliotecas en la línea de comandos de enlace antes de los archivos de objetos que las requieren. El vinculador carga los módulos de izquierda a derecha en la línea de comando. En el punto en la línea donde nombra -llua51, no se conocen símbolos indefinidos que puedan ser satisfechos por esa biblioteca. Luego nombra li.o, que sí tiene símbolos desconocidos.

Algunos entornos de tipo Unix no tratan esto como un error porque parte del proceso de enlace se difiere a la carga del programa cuando se satisfacen los archivos .so. Pero Cygwin, MinGW y Windows en general deben tratar esto como un error porque las DLL funcionan de manera bastante diferente a los archivos .so.

La solución es poner -llua51después de todos los archivos .o en su línea de enlace.

Edición: Incidentalmente, parece que estás enlazando con la distribución de Lua para Windows, pero construyendo con GCC bajo Cygwin. Deseará usar Dependency Walker para asegurarse de que su programa no dependa del tiempo de ejecución de Cygwin, y que dependa del mismo tiempo de ejecución de C que lua51.dll de Lua para Windows. IIRC, ese será el tiempo de ejecución para la versión anterior de Visual Studio. Es posible hacer que GCC se vincule con eso, pero necesitará usar el puerto MinGW (que puede usar de Cygwin) y vincularlo con un par de bibliotecas específicas para obtener esa versión. Estoy lejos de mi PC habitual, o me gustaría citar una línea de enlace exacta. (Creo que necesita -lmoldname -lmsvcr80 o algo así, como los últimos elementos en la línea de enlace.)

Causará problemas misteriosos y muy difíciles de diagnosticar si se utiliza más de una biblioteca de tiempo de ejecución de C. La respuesta fácil es usar la misma que tu DLL de Lua preferida. Otra alternativa es que el Lua Binaries project tiene DLL de Lua precompilados para una amplia gama de cadenas de herramientas C en Windows. Si necesita una aplicación Lua que comprenda el entorno Cygwin, querrá una que sea desarrollada por GCC para Cygwin y no como el sabor de Lua para Windows. Lua Binaries será tu amigo, o puedes construir Lua tú mismo desde la fuente.

+0

Gracias por la ayuda ... Sí, agregar el -llua51 al final de la línea de enlace resuelve el problema de compilación. Debido a que todavía tenía algunos problemas para ejecutar el ejecutable (permiso denegado) acabo de descargar el código fuente de lua y compilarlo usando make mingw. Esto parece solucionar el problema ... – JohnP

0

Los nombres en la API Lua do no tienen esos caracteres de subrayado iniciales. Intente compilar con -fno-leading-underscore.

+0

los subrayados son parte del cambio de nombre normal de C, y no son el problema aquí. Si parecen ser el problema, entonces es probable que tenga el DLL de Lua para Windows compilado para su uso con la cadena de herramientas de compilador de C incorrecta. – RBerteig

Cuestiones relacionadas