无法链接一个最小化的Lua程序。

我有一个trivial的Lua程序,我从书Programming In 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

我的makefile看起来像这样:

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'

这里有什么问题吗?

原文链接 https://stackoverflow.com/questions/4150081

点赞
stackoverflow用户501459
stackoverflow用户501459

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

2010-11-11 03:11:27
stackoverflow用户68204
stackoverflow用户68204

问题是在链接命令行上,你已经将库文件的名字放在需要它们的目标文件之前。链接器按照命令行上从左往右的顺序加载模块。在命名-llua51的位置上,没有任何未定义的符号与该库相匹配。而你命名的li.o,其中含有未知符号。

一些类Unix环境并不将此视为错误,因为链接过程的一部分被推迟到程序载入时,取决于.so文件引用的方式。但是,Cygwin、MinGW和Windows通常将其视为错误,因为DLL和.so文件的工作方式有很大不同。

解决方案是在链接命令行上的所有.o文件之后放置-llua51

编辑: 顺便说一下,看起来你正在链接Lua for Windows分发版,但在Cygwin下使用GCC进行编译。你需要使用Dependency Walker确保你的程序不依赖于Cygwin的运行时,并且确保它依赖于与Lua for Windows中的lua51.dll相同的C运行时。我IRC,那将是前一个版本的Visual Studio的运行时。可以使GCC链接到那个,但你需要使用MinGW端口(你可以从Cygwin使用),并链接到一些特定的库才能得到那个版本。我离我的常规PC有些远,否则我会引用一个准确的链接行。(我相信你需要在链接行的最后加上-lmoldname -lmsvcr80之类的东西。)

如果使用了超过一个C运行时库,将会引起神秘而非常难以诊断的问题。简单的答案是使用与你的首选Lua DLL相同的运行时库。另一个选择是Lua Binaries项目提供了各种C工具链在Windows上的预编译Lua DLL。如果需要一个理解Cygwin环境的Lua应用程序,则需要一个由GCC为Cygwin构建而不是Lua for Windows flavors构建的Lua应用程序。Lua Binaries会是你的朋友,或者你可以自己从源码构建Lua。

2010-11-11 06:19:49