如何正确链接 Linux 上的 lua 库?

Posted

技术标签:

【中文标题】如何正确链接 Linux 上的 lua 库?【英文标题】:How do I correctly link against lua libraries on Linux? 【发布时间】: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 输出:

$ sudo 安装 cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib /usr/local/man/man1 /usr/local/share/lua/5.3 /usr/local/lib/lua /5.3 cd src && install -p -m 0755 lua luac /usr/local/bin cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp /usr/local/include cd src && install -p -m 0644 liblua.a /usr/local/lib cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1

/usr/local/lib/liblua.a 已创建:

$ 文件 /usr/local/lib/liblua.a /usr/local/lib/liblua.a:当前 ar 存档

luaL_newstatelua_close 都在 /usr/local/lib/liblua.a 中定义:

$ nm /usr/local/lib/liblua.a | grep luaL_newstate 00000000000021e0 T luaL_newstate $ nm /usr/local/lib/liblua.a | grep lua_close 0000000000000790 T lua_close u lua_close

我知道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 【参考方案1】:

您的代码是 C++,但 Lua 库导出了 C API。

将 Lua 包含在 extern "C" ... 内或包含 lua.hpp

另外,您需要将-llua 放在命令行末尾:

g++ compile_lua.cpp -llua

【讨论】:

应该也应该把-llua放在最后。 “应该”和“必须”一样

以上是关于如何正确链接 Linux 上的 lua 库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Linux 下正确安装 Ghostscript 作为共享库

链接器找不到 Lua 库定义

将静态库链接到共享库(例如openmp)是一个好主意

链接器如何在剥离的动态库中定位代码?

编译链接 LUA5.1 库。 dev-cpp 中的错误

漏洞公告 | Lua v5.4.0及之前版本lsys_load()栈溢出漏洞