linux 编译lua动态库,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 中:

1e66a404504d4d0458cf04d83d7b321d.png

在 $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/include:Lua 头文件目录

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

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

编译动态链接库:

make

或者

make lib

ae6c72933deb2605f723024f5da071a4.png

编译可执行文件:

make lua

72bb4810537e8d1893137a269d155de6.png

77aa23ea34366d1a0c52b67909816f07.png

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

d9021b01d25db667df464550525269a4.png

注:

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

bf1ffe080eeaca73262350e384a458f3.png

否则运行 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值