试图在 C++ 中嵌入 Lua,“未定义对 'dlopen' 的引用”
Posted
技术标签:
【中文标题】试图在 C++ 中嵌入 Lua,“未定义对 \'dlopen\' 的引用”【英文标题】:Trying to embed Lua in c++, "undefined reference to 'dlopen'"试图在 C++ 中嵌入 Lua,“未定义对 'dlopen' 的引用” 【发布时间】:2014-05-23 07:06:48 【问题描述】:简而言之:使用命令g++ -o clua clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
编译和链接嵌入lua的c++程序,获取liblua5.1.so: undefined reference to 'dlopen'
等。
几周以来,我一直在尝试在我的 c++ 游戏中嵌入任何脚本语言,从 V8 到 Python 和 Squirrel,但都没有成功。 Lua 被宣传为“易于设置、体积小”等,所以我想我会去的。
我从http://sourceforge.net/projects/luabinaries/files/5.1.5/Linux%20Libraries/ 获得了预编译的 lua 二进制文件(我的 32bit ubuntu 13.something 使用了 lua-5.1.5_Linux26g4_lib.tar.gz)并有一个简单的示例程序:
extern "C"
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
int main()
lua_State *L = lua_open();
// load the libs
luaL_openlibs(L);
//run a Lua scrip here
luaL_dofile(L,"foo.lua");
printf("\nI am done with Lua in C++.\n");
lua_close(L);
return 0;
将其保存为“clua.cpp”并放置在解压缩的文件夹中(使其与“liblua5.1.a”和“liblua5.1.so”在同一目录中,并且lua头文件在一个名为“include”的文件夹)。现在,我正在尝试使用控制台编译程序,使用 g++,这是确切的命令:
g++ -o clua clua.cpp -c -Wall -Iinclude
它运行完美,不产生错误,并按预期创建二进制文件“clua”。但是,当我尝试链接时:
g++ -o clua clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
我明白了:
liblua5.1.so: undefined reference to `dlopen'
liblua5.1.so: undefined reference to `dlclose'
liblua5.1.so: undefined reference to `dlerror'
liblua5.1.so: undefined reference to `dlsym'
collect2: error: ld returned 1 exit status
我已经阅读了很多有类似问题的人的回复,提供的选项是:
添加“-ldl”,没有效果 确保“-ldl”是最后一个,也这样做了https://projects.coin-or.org/Ipopt/ticket/230 说添加 LDFLAGS="-Wl,--no-as-needed"
或 --enable-dependency-linking
应该可以解决问题,现在,我不确定我的命令到底应该是什么样子,是否放置
g++ -o clua LDFLAGS="-Wl,--no-as-needed" clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
或
g++ -o clua -Wl --no-as-needed clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
,
g++ --enable-dependency-linking -o clua clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
或
g++ -o clua clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl --enable-dependency-linking
但所有这些都给出了如下错误:
cc1plus: error: unknown pass dependency-linking specified in -fenable
https://projects.coin-or.org/Ipopt/ticket/229 说:“另一种解决方法是添加配置标志--disable-pthread-mumps”,我这样做了:
g++ -o clua --disable-pthread-mumps clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
得到了
cc1plus: error: unknown pass pthread-mumps specified in -fdisable
我从 clua.cpp、liblua5.1.a 和 liblua5.1.so 所在的目录运行这一切,并且其中有一个名为“include”的文件夹,其中包含标题。我在 32 位 Ubuntu 13 上运行它。(我认为是 10)。
现在,我该怎么做才能正确链接 Lua?
【问题讨论】:
remember, select isn't broken, 你可能想看看,哪种 lua 可以在你的 linux 上分发并使用它,并使用元构建生成器来避免编译标志错误。查看示例here->premake4.lua
。问题可能很简单,因为您只是为 gcc 编写了错误的标志
select 没有损坏 - 不错的文章,尽管我以前知道大部分这些事情。嗯,是的,你可能是对的,我可能做错了什么——只是我个人已经没有其他东西可以尝试了。这就是我在这里的原因。我将进入您提供的示例,但是如果您有时间,您能否详细说明我的标志可能存在的问题?如您所见,我在该区域尝试了一些东西(--enable-dependency-linking 等),但也许我将它们放在命令中的错误位置?
将 Lua 的源代码包含到您的项目中并使用-DLUA_USE_LINUX
构建它可能更简单。如果不需要为 Lua 动态加载 C 库,可以在luaconf.h
中禁用它,避免使用-ldl
。
可以禁用 libdl 的使用吗?伙计,这可能会解决所有问题。将首先尝试。
【参考方案1】:
-L liblua5.1.a liblua5.1.so
看起来不对 → link options → -llua5.1
?
然后,据我所知,Ubuntu/Debian 上有两个不同的 lua 库,其中一个不允许动态库加载,因此 -llua5.1-c++
并得到它:sudo apt-get install lua5.1 liblua5.1-dev
我的建议:如果您在使用 GNU Make 时遇到困难,请简化,使用 meta-make 生成器
【讨论】:
这看起来很有希望。我一回到家就会检查它。作为评论 - 我首先尝试了 -llua5.1,但我认为它找不到它。但我不确定,会再试一次。 哈,别打扰,它肯定已经安装了;)。从命令行工作,我可以输入“lua”并以交互方式使用它。 做sudo apt-get install lua5.1 liblua5.1-dev
工作!伙计,我不能说我有多感激;几周以来我一直没有成功,这确实使我的项目停滞不前。你是对的,“选择”没有被破坏。所以,是的,真的谢谢你。以上是关于试图在 C++ 中嵌入 Lua,“未定义对 'dlopen' 的引用”的主要内容,如果未能解决你的问题,请参考以下文章
嵌入在 C++ socket.http 中的 LUA [错误:尝试调用 nil 值]