【发布时间】: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 的使用吗?伙计,这可能会解决所有问题。将首先尝试。