Lua:Linux 平台编译 Lua 为动态链接库

Lua:Linux 平台编译 Lua 为动态链接库

在 Lua 源码的 makefile 中,没有编译动态链接库的目标(tagete),只可编译为静态库。

如何将 Lua 编译为动态链接库呢?

仔细研究下 Lua 的 makefile 文件,其实很简单。

Lua 版本:lua-5.3.5

我的 Lua 代码(lua-5.3.5/src)在 $HOME/lua/src 中:

Lua:Linux 平台编译 Lua 为动态链接库_第1张图片

在 $HOME/lua/src 中新增 makefile:

PLAT = linux

TO_BIN = lua
TO_INC = lua.h luaconf.h lualib.h lauxlib.h lua.hpp
TO_LIB = liblua.so

CC = gcc -std=gnu99 -fPIC
CFLAGS = -g -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)
LDFLAGS = $(SYSLDFLAGS)	$(MYLDFLAGS)
LIBS = -lm $(SYSLIBS) $(MYLIBS)

SYSCFLAGS = -DLUA_USE_LINUX
SYSLDFLAGS = -Wl,-E
SYSLIBS= -ldl -lreadline -llua -L$(INSTALL_LIB)

MYCFLAGS=
MYLDFLAGS=
MYLIBS=

SHARED = -shared

INSTALL_TOP = $(HOME)/lua
INSTALL_BIN = $(INSTALL_TOP)/bin
INSTALL_INC = $(INSTALL_TOP)/include
INSTALL_LIB = $(INSTALL_TOP)/lib

SRC = lapi.c        lauxlib.c   lbaselib.c      lbitlib.c   lcode.c \
      lcorolib.c    lctype.c    ldblib.c        ldebug.c    ldo.c \
      ldump.c       lfunc.c     lgc.c           linit.c     liolib.c \
      llex.c        lmathlib.c  lmem.c          loadlib.c   lobject.c \
      lopcodes.c    loslib.c    lparser.c       lstate.c    lstring.c \
      lstrlib.c     ltable.c    ltablib.c       ltm.c       lundump.c \
      lutf8lib.c    lvm.c       lzio.c

OBJS = $(SRC:%.c=%.o)

VERSION = 5.3.5

.c.o:
    @$(CC) $(CFLAGS) -o $@ -c $<
    @echo "Compile $< to $@ OK"

lib: $(OBJS)
    @$(CC) -o $(TO_LIB) $(SHARED) $(OBJS)
    @echo "Generate $(TO_LIB) OK"
    @mkdir -p $(INSTALL_INC) && cp -f $(TO_INC) $(INSTALL_INC)
    @echo "Install $(TO_INC) to $(INSTALL_INC) OK"
    @mkdir -p $(INSTALL_LIB) && cp -f $(TO_LIB) $(INSTALL_LIB)
    @echo "Install $(TO_LIB) to $(INSTALL_LIB) OK"
    @make clean

LUA_O = lua.o

lua: $(LUA_O)
    @make lib
    @$(CC) -o $(TO_BIN) $(LDFLAGS) $(LUA_O) $(LIBS)
    @mkdir -p $(INSTALL_BIN) && cp -f $(TO_BIN) $(INSTALL_BIN)
    @echo "Install $(TO_BIN) to $(INSTALL_BIN) OK"
    @make clean

echo:
    @echo "PLAT = $(PLAT)"
    @echo "TO_BIN = $(TO_BIN)"
    @echo "TO_INC = $(TO_INC)"
    @echo "TO_LIB = $(TO_LIB)"
    @echo "CC = $(CC)"
    @echo "CFLAGS = $(CFLAGS)"
    @echo "LDFLAGS = $(LDFLAGS)"
    @echo "LIBS = $(LIBS)"
    @echo "SHARED = $(SHARED)"
    @echo "INSTALL_TOP = $(INSTALL_TOP)"
    @echo "INSTALL_BIN = $(INSTALL_BIN)"
    @echo "INSTALL_INC = $(INSTALL_INC)"
    @echo "INSTALL_LIB = $(INSTALL_LIB)"
    @echo "LUA_VERSION = $(VERSION)"

clean:
    @rm -f $(OBJS)
    @rm -f $(TO_BIN)
    @rm -f $(TO_LIB)
    @echo "Clean OK"

.PHONY: lib lua echo clean
默认情况下:
$HOME/lua/bin:Lua 可执行文件目录
$HOME/lua/lib:Lua 动态库文件目录
$HOME/lua/includeLua 头文件目录

可以通过修改 makefile 相关变量更改默认设置。

此 makefile 是我随手写的(⊙o⊙),可能不完善且存在 BUG,发现问题请给我留言,谢谢。^_^

编译动态链接库:

make
或者
make lib

Lua:Linux 平台编译 Lua 为动态链接库_第2张图片

编译可执行文件:

make lua

Lua:Linux 平台编译 Lua 为动态链接库_第3张图片

Lua:Linux 平台编译 Lua 为动态链接库_第4张图片

试着执行刚生成的 lua 可执行文件:

Lua:Linux 平台编译 Lua 为动态链接库_第5张图片

注:

执行前请定义 LD_LIBRARY_PATH 并重新登陆,使环境变量生效:

Lua:Linux 平台编译 Lua 为动态链接库_第6张图片

否则运行 Lua 时可能找不到 lua 动态链接库或使用系统自带的 lua 动态链接库。


请注意:

上面的 makefile 是我参照 Lua 原版 makefile 在 Linux 下平台编写的,基本满足编译动态链接库和可执行文件的需求。

此 makefile 仅适用于 Linux 平台下编译 Lua 动态链接库。

对于非 Linux 平台(例如 HP-UX 或 IBM-AIX),此 makefile 不尽相同,需要参考原版 makefile 进行更新噢!


可以通过对 Lua 原版 makefile 修改,进行编译动态链接库,请参见:

https://www.cnblogs.com/lianye920129/p/7832586.html

你可能感兴趣的:(LINUX,LUA)