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
在 $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
编译可执行文件:lua
make lua
试着执行刚生成的 lua 可执行文件:spa
注:debug
执行前请定义 LD_LIBRARY_PATH 并从新登录,使环境变量生效:
不然运行 Lua 时可能找不到 lua 动态连接库或使用系统自带的 lua 动态连接库。
请注意:
上面的 makefile 是我参照 Lua 原版 makefile 在 Linux 下平台编写的,基本知足编译动态连接库和可执行文件的需求。
此 makefile 仅适用于 Linux 平台下编译 Lua 动态连接库。
对于非 Linux 平台(例如 HP-UX 或 IBM-AIX),此 makefile 不尽相同,须要参考原版 makefile 进行更新噢!
能够经过对 Lua 原版 makefile 修改,进行编译动态连接库,请参见: