无法链接最小的Lua程序

Joh*_*hnP 5 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;
}
Run Code Online (Sandbox Code Playgroud)

我的环境是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
Run Code Online (Sandbox Code Playgroud)

我的/ 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'
Run Code Online (Sandbox Code Playgroud)

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

RBe*_*eig 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中使用),并链接到几个特定的​​库以获得该版本.我离开了我常用的PC,或者我引用了一个确切的链接线.(我相信你需要-lmoldname -lmsvcr80或类似的东西,作为链接线上的最后一项.)

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