下载lua源码,编译,安装
wget -c https://www.lua.org/ftp/lua-5.3.4.tar.gz
tar -zxvf lua-5.3.4.tar.gz
cd lua-5.3.4
make linux
这时候遇到了问题
gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_2 -DLUA_USE_LINUX -c -o lua.o lua.c
lua.c:80:31: 错误:readline/readline.h:没有那个文件或目录
lua.c:81:30: 错误:readline/history.h:没有那个文件或目录
lua.c: 在函数‘pushline’中:
lua.c:312: 警告:隐式声明函数‘readline’
lua.c:312: 警告:赋值时将整数赋给指针,未作类型转换
lua.c: 在函数‘loadline’中:
lua.c:377: 警告:隐式声明函数‘add_history’
问题是因为缺少readline库,下载安装readline
yum install readline-devel
或者
wget -c ftp://ftp.gnu.org/gnu/readline/readline-7.0.tar.gz
tar -zxvf readline-7.0.tar.gz
cd readline-7.0.tar.gz
./configure
make && make install
然后回到lua的src目录下,再次make linux,上面的错误如果还是存在,这个和刚才安装的readline的位置有关系。
修改src/Makefile
MYCFLAGS=-I/SERVICE/xunYu/workspace
MYLDFLAGS=-L/SERVICE/xunYu/workspace/readline/shlib
保存退出后到lua的src下,再次make linux,出现下面的错误
gcc -std=gnu99 -o lua -L/SERVICE/xunYu/workspace/readline/shlib lua.o liblua.a -lm -Wl,-E -ldl -lreadline
/SERVICE/xunYu/workspace/readline/shlib/libreadline.so: undefined reference to `PC'
/SERVICE/xunYu/workspace/readline/shlib/libreadline.so: undefined reference to `tgetflag'
/SERVICE/xunYu/workspace/readline/shlib/libreadline.so: undefined reference to `tgetent'
/SERVICE/xunYu/workspace/readline/shlib/libreadline.so: undefined reference to `UP'
/SERVICE/xunYu/workspace/readline/shlib/libreadline.so: undefined reference to `tputs'
/SERVICE/xunYu/workspace/readline/shlib/libreadline.so: undefined reference to `tgoto'
/SERVICE/xunYu/workspace/readline/shlib/libreadline.so: undefined reference to `tgetnum'
/SERVICE/xunYu/workspace/readline/shlib/libreadline.so: undefined reference to `BC'
/SERVICE/xunYu/workspace/readline/shlib/libreadline.so: undefined reference to `tgetstr'
原因:lua编译依赖readline库,而其依赖ncurses库,但没有指定,所以出现“未定义的符合引用”错误。需要修改readline/src/Makefile中linux编译target,在SYSLIBS变量中追加‘-lncurses’选项即可。修改后,如下
linux:
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline -lncurses"
再次编译,如果还是不行,看看是不是ncurses-devel没有安装,安装ncurses-devel
wget -c ftp://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz
tar -zxvf ncurses-6.0.tar.gz
cd ncurses-6.0
./configure
make && make install 然后到lua的src下,再次make linux,成功
make install
lua -v查看lua的版本,结果出现下面的问题
lua: error while loading shared libraries: libreadline.so.6: cannot open shared object file: No such file or directory
解决方法:
把刚才安装的libreadline.so.7所在lib位置加入到/etc/ld.so.conf文件当中。
或者
查看/usr/local/lib下是否存在libreadline.so.6,如果不存在创建一个链接,libreadline.so.7在你刚才安装readline目录下shlib下,我的是/usr/local/readline-7/shlib
ln -s /usr/local/readline-6.2/shlib/libreadline.so.7 libreadline.so.6
然后/etc/ld.so.conf中加入/usr/local/lib这一行,一般都可以解決此问题,不仅仅是对于libreadline.so.5,大部分的so都存在这/usr/local/lib这个目录里面
最后将/etc/ld.so.conf保存后,还要执行ldconfig 才会使更改生效