lua源码编译linux,Lua:Linux 平台编译 Lua 为动态连接库

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

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

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

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

Lua 版本:lua-5.3.5api

个人 Lua 代码(lua-5.3.5/src)在 $HOME/lua/src 中:ruby

18d8aff831a8442f38e56b84fd92df02.png

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

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,发现问题请给我留言,谢谢。^_^

编译动态连接库:ui

make

或者

make lib

4cb6673d6f4c9a7668ba711aebe69ed9.png

编译可执行文件:lua

make lua

7ab98f12312600c45d87e19860539ecc.png

41dac30cf8ad5e75672fa74f4e334c67.png

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

afbec7316cafb28c525f42092e7249af.png

注:debug

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

b7f1806e44759cd1c409ad312532f4df.png

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

请注意:

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

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

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

能够经过对 Lua 原版 makefile 修改,进行编译动态连接库,请参见:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值