试图将Lua嵌入到c ++中,“未定义引用'dlopen'”

时间:2014-05-23 07:06:49

标签: c++ lua linker embedding

简而言之:使用命令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二进制文件(我使用lua-5.1.5_Linux26g4_lib.tar.gz作为我的 32bit ubuntu 13.something )并有一个简单的示例程序:

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?

1 个答案:

答案 0 :(得分:2)

-L liblua5.1.a liblua5.1.so看起来错了→link options-llua5.1

然后,在Ubuntu / Debian上有两个不同的lua库,据我记得,其中一个不允许动态库加载,因此-llua5.1-c++得到它:{{1} }

我的建议:简化,如果你正在与GNU Make挣扎,请使用元制作生成器