我有以下简单的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'
关于我在这里做错了什么的想法?
答案 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
进行编译。