如何在Linux上正确链接Lua库?

我查看了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 << "未能加载文件。\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 make install
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 被创建出来了:

$ file /usr/local/lib/liblua.a
/usr/local/lib/liblua.a: current ar archive

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: in function `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: in function `my_exit(lua_State*, int)':
compile_lua.cpp:(.text+0xb8): undefined reference to `lua_close(lua_State*)'
collect2: error: ld returned 1 exit status

我运行 g++ /usr/local/lib/liblua.a compile_lua.cpp 时也会得到相同的输出。

我哪里做错了吗?

点赞
用户107090
用户107090

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

将 Lua 的 include 文件放在 extern "C" {...} 内或者直接包含 lua.hpp

另外,在命令行的末尾需要添加 -llua

g++ compile_lua.cpp -llua
2021-06-30 18:23:02