试图在 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 值]

Lua - C++ 集成:从 C++ 调用表中的函数

使用C ++代码获取Lua package.cpath和path

C ++ Lua嵌入,将表推送到参数上的函数

Lua与C语言的互相调用

试图将 python 嵌入到 Visual Studio 2010 C++ 文件中,并以代码 1 退出