使用 Lua 链接动态 lib.so 时出错

Posted

技术标签:

【中文标题】使用 Lua 链接动态 lib.so 时出错【英文标题】:Error when linking a dynamic lib.so using Lua 【发布时间】:2014-07-31 04:47:42 【问题描述】:

问题背景:

操作系统:Linux Ubuntu

编译器:gcc

语言:C++

2个项目:

项目1:使用Lua构建动态库; (libBattleCore.so)

项目 2:使用项目 1 生成的 libBattleCore.so 构建控制台应用程序

问题描述

项目2编译命令:

g++ -Wall -fexceptions -O2 -o bin/Release/BattleConsole  libBattleCore.h main.cpp -I/home/Downloads/lua-5.2.3/install/include/ -L. -lBattleCore

错误信息

./libBattleCore.so: undefined reference to `luaopen_table'
./libBattleCore.so: undefined reference to `lua_getfield'
./libBattleCore.so: undefined reference to `lua_isstring'
...
./libBattleCore.so: undefined reference to `lua_tolstring'
collect2: error: ld returned 1 exit status

有什么问题和解决方案是什么?谢谢

附加信息

项目 1 构建命令:

g++ -O2 -fPIC -shared -o bin/Release/libBattleCore.so -I/home/Downloads/lua-5.2.3/install/include/ -L/home/Downloads/lua-5.2.3/install/lib/ -llua Basic_Battle/Arsenal.cpp Basic_Battle/BaseEntity.cpp  ...(lots of cpp files) 

ldd libBattleCore.so :

linux-vdso.so.1 =>  (0x00007ffff7ffe000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f008f35a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f008f054000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f008ee3d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f008ea77000)
/lib64/ld-linux-x86-64.so.2 (0x00007f00946a8000)

【问题讨论】:

ldd libBattleCore.so 输出什么? 我已经编辑了这个问题。似乎 libBattleCore.so 不包含 lua 中的任何内容,那么如何将 lua 嵌入其中? 缺少lua的所以,加-llua看看是否正常 项目1构建命令中已经有-llua...在项目2构建命令中添加-llua时出现同样的错误信息 【参考方案1】:

问题解决了……

还是用lua编译项目2...

编译命令:

g++ -Wall -fexceptions -O2 -o bin/Release/BattleConsole  libBattleCore.h main.cpp -L. -lBattleCore -llua -ldl

动态库 (.so) 应复制到 /usr/lib/ 然后 ldd BattleCosnole 将列出 libBattleCore.so => /usr/ ...不再“未找到”

我还想要一些其他的方法来自定义.so的路由

谢谢

【讨论】:

你不需要 /usr/lib 中的 liblua,你只需要在你用 -L 告诉编译器/链接器的路径中。话虽如此,是的,您需要将 lua 链接到使用它的东西(通常是二进制文件),尽管从独立库链接它也可以。

以上是关于使用 Lua 链接动态 lib.so 时出错的主要内容,如果未能解决你的问题,请参考以下文章

动态链接如何知道在哪里可以找到链接的文件?

linux工作知识点滴

ldconfig

linux中ldconfig的使用介绍

ldconfig命令的作用

Android 安装包优化使用 lib7zr.so 动态库处理压缩文件 ( 测试 lib7zr.so 动态库调用 )