在Linux上嵌入Lua的静态库进行链接时出现错误。

更新

在项目2(console)中使用了-ldl和链接liblua.a后,编译是可以的,但当运行时,一旦运行Lua函数,它就会崩溃并出现错误Segment fault (core dumped)。


问题背景:

  • 操作系统: Linux Ubuntu

  • IDE: CodeBlock

  • 语言: C++

  • 2个项目:

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

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

问题描述

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

问题是在构建项目2时,它说项目1中的库中的那些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,应该已在应该已嵌入了Lua的静态库“libBattleCore.a”中构建。

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


附加信息:

  • 项目2应包括: "libBattleCore.h", "main.cpp", libBattleCore.a

  • 项目1: CodeBlock构建选项已在编译搜索目录中包括"Lua/install/include",链接搜索目录中包括"Lua/install/lib"

  • 相同的代码已在Win上成功构建和运行,使用的是VS2012

  • 如果需要其他任何信息,请告知,我会添加的。

  • 我是一个对Linux和g++还很生手的人。 :-(

谢谢

点赞
用户3884846
用户3884846

我没有50个声望值就不能评论。没有匿名回复的支持。所以在这里发布是我唯一能做的。

可能已经过了几年,但是我认为用g++,你在命令行上列出.o文件,在库中使用**-L指定要搜索的目录,然后使用-lname来包含库。(其中name缺少前缀lib和后缀.a**)。例如: -L../BattleConsole -lBattleCore

哦,而**-lfoo -lbar-lbar -lfoo**的顺序是关键的,决定了哪个库可以使用另一个库中的代码。

并不清楚静态库是否一定包含其他库的代码。您可能需要按照正确的顺序链接(来自project1的库)。

尝试使用 "nm"。如 nm --demangle libBattleCore.a | grep ... 这将让您查看每个库中包含的内容。 man nm 或者http://linux.die.net/man/1/nm 可以帮助您弄清楚字母的含义。例如,U是未定义的(已使用但未提供)。T在文本(代码)段中定义。WV是弱定义的。等等。

2014-07-28 16:09:25