通过 makefile 从源构建和链接 lua

Building and linking lua from source via makefile

我已经尝试编译 link lua 我的应用程序。这是我的生成文件:

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

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

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

我错过了什么?

您正在放置 libLua.so(顺便说一下,我个人认为将您的库命名为与标准库相同的名称是一个非常糟糕的主意,只是大写...没有办法' t bite you or someone in around at some point) in the lua subdirectory 但你不告诉链接器在哪里可以找到它。

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

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

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

您必须明确地将 lua 编译为 c++ 代码。

你通过包括

来做到这一点
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

代替 #include <lua.hpp> 其中包括 extern "C" {...} 语句。