c++ - 在Linux上链接嵌入Lua的静态库时出错

标签 c++ linux lua static-libraries

更新

在项目 2(控制台)中使用 -ldl 并链接 liblua.a 后,编译没问题,但是当它运行时,一旦运行 Lua 函数,就会崩溃并出现错误 Segment failure (core dumped)。

<小时/>

问题背景:

  • 操作系统:Linux Ubuntu

  • IDE:代码块

  • 语言:C++

  • 2 个项目:

    • 项目1:使用Lua的静态库;

    • 项目 2:控制台应用程序,使用项目 1 生成的库

问题描述

项目1(静态库)已成功构建。

问题是,在构建项目 2 时,它说项目 1 的 lib 中的那些 Lua 函数未定义,以下是部分错误消息:

g++  -o bin/Release/BattleConsoleCB obj/Release/main.o  -s
../BattleConsole/libBattleCore.a
../BattleConsole/libBattleCore.a(DataLoader.o): 
In function `boolDataLoader::GetNumber<double>(char const*, double&) [clone .isra.5]':
DataLoader.cpp:(.text+0x13): undefined reference to `lua_settop'
DataLoader.cpp:(.text+0x1e): undefined reference to `lua_getglobal'
DataLoader.cpp:(.text+0x2b): undefined reference to `lua_isnumber'
DataLoader.cpp:(.text+0x3e): undefined reference to `lua_tonumberx'
DataLoader.cpp:(.text+0x51): undefined reference to `lua_settop'

请注意,“DataLoader.cpp”来自项目 1,它应该构建在静态库“libBattleCore.a”中,该库应该嵌入 Lua。

如何解决这个问题?感谢您的帮助。

<小时/>

其他信息:

  • 项目 2 应包括:“libBattleCore.h”、“main.cpp”、libBattleCore.a

  • 项目 1:CodeBlockbuilding 选项已在编译搜索目录中包含“Lua/install/include”,在链接搜索目录中包含“Lua/install/lib”

  • 使用 VS2012 在 Win 上成功构建并运行相同的代码

  • 如果还有什么需要请告知,我会添加。

  • 我是 Linux 和 g++ 的新手。 :-(

谢谢

最佳答案

如果没有 50 次代表,我无法发表评论。不支持匿名回复。所以我能做的就是在这里发帖。

已经过去几年了,但是对于 g++,我认为您在命令行上列出的是 .o 文件,对于库,您使用 -L 指定要搜索的目录,然后使用 -lname 包含库。 (名称缺少前导 lib 和尾随 .a。) -L../BattleConsole -lBattleCore

哦,-lfoo -lbar-lbar -lfoo 的顺序非常重要,决定哪个库可以使用另一个库的代码。

尚不清楚静态库是否必须包含其他库的代码。您可能需要(以正确的顺序)链接到project1 中的库。

尝试“nm”。如nm --demangle libBattleCore.a | grep ... 这将让您看到每个库中到底包含什么内容。 ma​​n nmhttp://linux.die.net/man/1/nm可以帮助您弄清楚这些字母代表什么。例如,U 未定义(未提供时使用)。 T 在文本(代码)段中定义。 WV 是弱定义的。等等

关于c++ - 在Linux上链接嵌入Lua的静态库时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24995505/

相关文章:

我可以将 lua_tointeger() 用于 off_t 吗?

lua - 为什么在lua中访问局部变量比全局变量更快?

linux - tar 在脚本中返回 1,但不以交互方式返回

string - 向 Lua 添加裸词

iphone - 在 iPhone 上调试一个模糊的错误

c++ - 从 std::vector 存储到 std::set,其中 vector 包含一个结构,但 std::set 仅包含结构中的一个元素

linux - 如何使用 `repo forall -c <something>`,其中 <something> 是 bash 别名或函数

linux - 在 Linux 启动时运行时我的应用程序速度很慢

c++ - void(int) 和 void (*)(int) 之间的区别

c++ - SDL2 窗口在 raspbian 上不显示