我如何正确 link 反对 Linux 上的 lua 库?
How do I correctly link against lua libraries on Linux?
我查看了 Cannot link with Lua library on Linux,但 OP 的问题是他们使用了错误的函数名称。正如我将在下面演示的那样,我确信我使用了正确的函数名称。
我想成功 link 下面的 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
输出:
$ 须藤使安装
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_newstate
和lua_close
都定义在/usr/local/lib/liblua.a
:
$纳米/usr/local/lib/liblua.a | grep luaL_newstate
00000000000021e0 T luaL_newstate
$纳米/usr/local/lib/liblua.a | grep lua_close
0000000000000790 T lua_close
你lua_close
我知道 nm
的输出中的 T
意味着符号在 library/binary 的文本(代码)部分,但不一定意味着函数的方式被调用与函数签名匹配。但是,我查阅了 luaL_newstate()
and lua_close()
并且我的用法与在线文档中的函数签名相匹配。
然而,当我尝试构建二进制文件时,出现未定义的引用错误:
$ g++ -llua compile_lua.cpp
/usr/bin/ld: /tmp/ccCYvjwX.o: 在函数“main”中:
compile_lua.cpp:(.text+0x1c): 对“luaL_newstate()”的未定义引用
/usr/bin/ld: compile_lua.cpp:(.text+0x38): 未定义引用`luaL_loadfilex(lua_State*, char const*, char const*)'
/usr/bin/ld: /tmp/ccCYvjwX.o: 在函数 `my_exit(lua_State*, int)' 中:
compile_lua.cpp:(.text+0xb8): 未定义引用`lua_close(lua_State*)'
collect2:错误:ld 返回 1 退出状态
当我 运行 g++ /usr/local/lib/liblua.a compile_lua.cpp
时得到相同的输出。
我做错了什么?
您的代码是 C++,但 Lua 库导出 C API。
将 Lua 包含在 extern "C" {...}
中,或者改为包含 lua.hpp
。
另外,需要在命令行末尾加上-llua
:
g++ compile_lua.cpp -llua
我查看了 Cannot link with Lua library on Linux,但 OP 的问题是他们使用了错误的函数名称。正如我将在下面演示的那样,我确信我使用了正确的函数名称。
我想成功 link 下面的 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
输出:
$ 须藤使安装 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_newstate
和lua_close
都定义在/usr/local/lib/liblua.a
:
$纳米/usr/local/lib/liblua.a | grep luaL_newstate 00000000000021e0 T luaL_newstate $纳米/usr/local/lib/liblua.a | grep lua_close 0000000000000790 T lua_close 你lua_close
我知道 nm
的输出中的 T
意味着符号在 library/binary 的文本(代码)部分,但不一定意味着函数的方式被调用与函数签名匹配。但是,我查阅了 luaL_newstate()
and lua_close()
并且我的用法与在线文档中的函数签名相匹配。
然而,当我尝试构建二进制文件时,出现未定义的引用错误:
$ g++ -llua compile_lua.cpp /usr/bin/ld: /tmp/ccCYvjwX.o: 在函数“main”中: compile_lua.cpp:(.text+0x1c): 对“luaL_newstate()”的未定义引用 /usr/bin/ld: compile_lua.cpp:(.text+0x38): 未定义引用`luaL_loadfilex(lua_State*, char const*, char const*)' /usr/bin/ld: /tmp/ccCYvjwX.o: 在函数 `my_exit(lua_State*, int)' 中: compile_lua.cpp:(.text+0xb8): 未定义引用`lua_close(lua_State*)' collect2:错误:ld 返回 1 退出状态
当我 运行 g++ /usr/local/lib/liblua.a compile_lua.cpp
时得到相同的输出。
我做错了什么?
您的代码是 C++,但 Lua 库导出 C API。
将 Lua 包含在 extern "C" {...}
中,或者改为包含 lua.hpp
。
另外,需要在命令行末尾加上-llua
:
g++ compile_lua.cpp -llua