【发布时间】:2021-09-12 21:42:04
【问题描述】:
我查看了Cannot link with Lua library on Linux,但 OP 的问题是他们使用了错误的函数名称。正如我将在下面演示的那样,我确信我使用了正确的函数名称。
我想成功地将下面的 C++ 代码链接到 lua 以创建二进制文件:
// compile_lua.cpp
#include <iostream>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
void my_exit(lua_State* lua, int exit_code);
int main(int argc, char* argv[])
{
lua_State* lua = nullptr;
int ret;
lua = luaL_newstate();
ret = luaL_loadfile(lua, "helloworld.lua");
if (ret != 0) {
std::cerr << "Failed to load file.\n";
my_exit(lua, 1);
}
my_exit(lua, 0);
}
void my_exit(lua_State* lua, int exit_code)
{
if (lua != nullptr) {
lua_close(lua);
}
std::exit(exit_code);
}
我从源代码构建了 lua。这是我的make install 输出:
/usr/local/lib/liblua.a 已创建:
luaL_newstate 和 lua_close 都在 /usr/local/lib/liblua.a 中定义:
我知道nm 的输出中的T 表示该符号位于库/二进制文件的文本(代码)部分中,但并不一定意味着调用函数的方式与函数签名匹配。但是,我查了luaL_newstate() 和lua_close(),我的用法与在线文档中的函数签名匹配。
然而,当我尝试构建我的二进制文件时,我得到了未定义的引用错误:
$ g++ -llua compile_lua.cpp /usr/bin/ld: /tmp/ccCYvjwX.o: 在函数“main”中: compile_lua.cpp:(.text+0x1c): undefined reference to `luaL_newstate()' /usr/bin/ld: compile_lua.cpp:(.text+0x38): undefined reference to `luaL_loadfilex(lua_State*, char const*, char const*)' /usr/bin/ld: /tmp/ccCYvjwX.o: 在函数“my_exit(lua_State*, int)”中: compile_lua.cpp:(.text+0xb8): undefined reference to `lua_close(lua_State*)' collect2:错误:ld 返回 1 个退出状态当我改为运行 g++ /usr/local/lib/liblua.a compile_lua.cpp 时,我得到了相同的输出。
我做错了什么?
【问题讨论】:
-
请注意,
luaL_loadfile会加载但不会运行您的脚本。要加载和运行,请使用luaL_dofile。