c++ - 尝试将 Lua 嵌入到 C++ 中, "undefined reference to ' dlopen'”

标签 c++ lua linker embedding

简而言之:使用命令g++ -o clua clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so编译和链接嵌入lua的c++程序-ldl,获取liblua5.1.so:对“dlopen”的 undefined reference 等。

几周以来,我一直在尝试在我的 C++ 游戏中嵌入任何脚本语言,从 V8 到 Python 和 Squirrel,但都没有成功。 Lua 的营销理念是“易于设置、体积小”等,所以我想我会同意这一点。

我已经从http://sourceforge.net/projects/luabinaries/files/5.1.5/Linux%20Libraries/获得了预编译的lua二进制文件(我在 32 位 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”的文件夹,其中包含 header 。我在 32 位 Ubuntu 13 上运行它。(我想是 10)。

现在,我该怎么做才能正确链接 Lua?

最佳答案

-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 上遇到困难,请使用元制作生成器

关于c++ - 尝试将 Lua 嵌入到 C++ 中, "undefined reference to ' dlopen'”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23823031/

相关文章:

c++ - 如何使用参数化构造函数动态分配对象数组?

c++ - C++中的哪个替代方案?

Lua, WOW 和 "..."

Lua not not 和 not not 不一样

ios - 本地化 xib 时出现 Xcode 链接器错误

c++ - C++ 如何删除数组中的多个元素?

sqlite - 如何使用 luasql.sqlite3 为 sqlite 数据库指定 busytimeout 值

c - undefined reference ... - 链接问题?

linker - LLVM 的 lld 的命令行选项文档在哪里?

c++ - 多次包含cpp文件