我有以下简单的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)
关于我在这里做错了什么的任何想法?
问题是您已在链接命令行上的库命名库之前需要它们的目标文件.链接器在命令行上从左到右加载模块.在您命名的行上的点处-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你自己.
归档时间: |
|
查看次数: |
4616 次 |
最近记录: |