无法链接最小的Lua程序

时间:2010-11-10 23:22:27

标签: lua

我有以下简单的Lua程序,我从“编程在Lua”一书中复制了

#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;
}

我的环境是cywin

我的make文件如下所示:

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

我的/ home / xyz / c_drive / Program Files / Lua / 5.1 / lib目录包含lua5.1.dll lua5.1.lib lua51.dll和lua51.lib

尝试构建我的主目标我遇到以下错误:

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'

关于我在这里做错了什么的想法?

2 个答案:

答案 0 :(得分:9)

问题是您在需要它们的目标文件之前已在链接命令行上命名了库。链接器在命令行上从左到右加载模块。在您命名为-llua51的行上的点处,不知道该库可以满足的未定义符号。然后命名li.o,其中包含未知符号。

某些类Unix环境不会将此视为错误,因为当满足对.so文件的引用时,部分链接进程会延迟到程序加载。但Cygwin,MinGW和Windows通常必须将此视为错误,因为DLL与.so文件的工作方式完全不同。

解决方案是在链接行上的所有-llua51文件之后添加.o

编辑:顺便说一下,您似乎是在链接Lua for Windows发行版,但是在Cygwin下使用GCC进行构建。您将需要使用Dependency Walker来确保您的程序不依赖于Cygwin运行时,并且它确实依赖于与Lua for Windows的lua51.dll相同的C运行时。 IIRC,这将是以前版本的Visual Studio的运行时。可以使用GCC链接,但是您需要使用MinGW端口(可以从Cygwin中使用),并链接到几个特定的​​库以获得该版本。我离开了我常用的电脑,或者我引用了一个确切的链接线。 (我相信你需要-lmoldname -lmsvcr80或类似的东西,作为链接线上的最后一项。)

如果正在使用多个C运行时库,则会导致神秘且非常难以诊断问题。简单的答案是使用相同的Lua DLL。另一个替代方案是Lua Binaries project已经为Windows上的各种C工具链预编译了Lua DLL。如果您需要一个了解Cygwin环境的Lua应用程序,您将需要一个由GCC为Cygwin构建而不是Lua for Windows风格的应用程序。 Lua Binaries将是你的朋友,或者你可以从源头上建立Lua你自己。

答案 1 :(得分:0)

Lua API中的名称​​不具有那些前导下划线。尝试使用-fno-leading-underscore进行编译。