无法链接一个最小化的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
问题是在链接命令行上,你已经将库文件的名字放在需要它们的目标文件之前。链接器按照命令行上从左往右的顺序加载模块。在命名-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。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
Lua API 中的名称没有这些前导下划线。尝试使用
-fno-leading-underscore
进行编译。