【问题标题】:Building and linking lua from source via makefile通过 makefile 从源代码构建和链接 lua
【发布时间】:2021-06-30 13:58:15
【问题描述】:

我尝试编译并链接 lua 与我的应用程序。这是我的makefile:

app.o: app.cpp
    g++ -c app.cpp

PATH_LUA=../lua-5.4.3/src
LUA= \
$(PATH_LUA)/lapi.c \
$(PATH_LUA)/lauxlib.c \
$(PATH_LUA)/lbaselib.c \
$(PATH_LUA)/lcode.c \
$(PATH_LUA)/lcorolib.c \
$(PATH_LUA)/lctype.c \
$(PATH_LUA)/ldblib.c \
$(PATH_LUA)/ldebug.c \
$(PATH_LUA)/ldo.c \
$(PATH_LUA)/ldump.c \
$(PATH_LUA)/lfunc.c \
$(PATH_LUA)/lgc.c \
$(PATH_LUA)/linit.c \
$(PATH_LUA)/liolib.c \
$(PATH_LUA)/llex.c \
$(PATH_LUA)/lmathlib.c \
$(PATH_LUA)/lmem.c \
$(PATH_LUA)/loadlib.c \
$(PATH_LUA)/lobject.c \
$(PATH_LUA)/lopcodes.c \
$(PATH_LUA)/loslib.c \
$(PATH_LUA)/lparser.c \
$(PATH_LUA)/lstate.c \
$(PATH_LUA)/lstring.c \
$(PATH_LUA)/lstrlib.c \
$(PATH_LUA)/ltable.c \
$(PATH_LUA)/ltablib.c \
$(PATH_LUA)/ltm.c \
$(PATH_LUA)/lundump.c \
$(PATH_LUA)/lutf8lib.c \
$(PATH_LUA)/lvm.c \
$(PATH_LUA)/lzio.c

libLua.so:
    g++ -shared $(LUA) -fPIC -o lua/libLua.so
 
all: libLua.so app.o
    g++ -o app app.o -I$(PATH_LUA) -lLua -Llua -ldl

编译工作正常,但链接出了点问题,因为我得到了大量的undefined references to "lua_XYZ-function"。例如,undefined reference to lua_tointegerx 没有意义,因为它的实现位于上面文件列表中的lapi.c

(INB4:“这是一个重复的问题!”……我已尽力检查所有内容。)

我错过了什么?

【问题讨论】:

    标签: lua c++17 gnu-make static-linking


    【解决方案1】:

    您正在输入libLua.so(顺便说一句,我个人认为将您的库命名为与标准库相同的名称是一个非常糟糕的主意,只是大写......没有办法不能咬你或lua 子目录中的某个人在后面),但你没有告诉链接器在哪里找到它。

    然后,您将liblua.a 列为先决条件,但您没有构建liblua.a 的实际规则,这意味着make 将根据其内部规则提出一个......它使用的任何规则都会当然不包括你所有的源文件(它怎么知道?)。

    如果您向我们展示运行 make 的实际输出(在所有错误消息之前),应该很清楚这从一开始就出错了。

    从严格的 makefile 角度讲,您的配方构建的文件名称与 makefile 中目标的名称不同几乎总是错误的。

    【讨论】:

    • 也许你的命名已经让我感到厌烦了:也许先决条件liblua.a 应该引用标准lua?那是在您的本地目录中吗?一切都是混乱和混乱......我建议您重新命名,确定您需要哪些-L 链接器选项,如果您仍然无法找出问题,请编辑您的问题,显示您运行的 make 命令、编译命令和链接命令 make 被调用,以及链接器生成的 FIRST 组错误:第一个错误总是最重要的错误。最后的错误更可能是无趣的。
    • 我在此处撰写此问题时复制了有关 .a 文件的错误文件名。我当然在我的makefile中尝试过.so。另请注意,标准 lua 库名为 lua我的图书馆有一个大写L。第一个错误:/usr/bin/ld: app.o: in function "delay(lua_State*)": app.cpp:(.text+0x3f): undefined reference to "lua_tointegerx"(是的,我确定。)我告诉链接器我的库在./lua
    • 我知道你用大写的 L 命名它。请参阅我的评论 我认为将你的库命名为与标准库相同的名称是一个非常糟糕的主意,只是大写。无论如何,您的 makefile 中没有任何内容可以告诉我们出了什么问题,因此问题一定是不存在的。确保周围没有任何其他 libLua.so 或 libLua.a 库。您还可以将-Wl,-t 选项添加到您的链接行,让链接器打印它找到的库。您可以运行nm -o lua/libLua.so | grep lua_tointegerx 来查看它是否存在以及它的链接是什么。
    • 如果不得不猜测,在不了解 Lua 的情况下,如果要将其链接到共享库以强制所有符号公开,则必须提供一些编译时选项。如果你把它变成一个静态库,它会起作用吗?
    • 通过-Wl,-t 的lib 列表肯定包含lua/libLua.sonm -o lua/libLua.so | grep lua_tointegerx 给我lua/libLua.so:000000000000b996 T _Z14lua_tointegerxP9lua_StateiPi 似乎正确,不是吗?
    【解决方案2】:

    您必须将 lua 显式编译为 c++ 代码。

    你可以通过包含来做到这一点

    #include <lua.h>
    #include <lualib.h>
    #include <lauxlib.h>
    

    而不是 #include &lt;lua.hpp&gt; 包括 extern "C" {...} 声明。

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多