编译 Lua - 创建 .so 文件?

我正在Centos 6.5上编译Lua 5.2.3,编译/安装正常。

但是,我还需要另一个程序的开发库才能编译。通常我会通过这样做安装:

yum install lua-devel

问题是,它安装的是Lua 5.1共享库,而不是5.2.3。

我可以只使用Centos repo中的Lua 5.1,但是如果有一个相对简单的方法(对于了解的人来说),使最新版本工作,则会感激有人向我展示方法。对我来说,Linux的Makefiles还是有点,呃,你知道的...

编辑

我找到了这个网站-http://lua-users.org/lists/luah/2006-10/msg00091.html,它很久以前建议对Makefile进行一些更改,但是当我运行它们时,我会得到以下结果:

gcc -fPIC -o liblua.so -shared lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o
lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o
ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o
liolib.o lmathlib.o loslib.o lstrlib.o ltablib.o loadlib.o linit.o
/usr/bin/ld: lapi.o: relocation R_X86_64_32 against `luaO_nilobject_' can not be used
when making a shared object; recompile with -fPIC

请注意,我在徒劳的努力中添加了-fPIC;链接中没有建议。

编辑2-解决方案

好吧,虽然我最初自己找到了这个mod,但是catwell的保证使我坚持下去。这是我做的...

catwell的链接 ,我手动编辑了Makefile。很容易跟进(如catwell所建议的,忽略luaconf.h mods)。

缺少的连接是更改以下行:

src/Makefile
------------
CFLAGS= -O2 -Wall -DLUA_COMPAT_ALL $(SYSCFLAGS) $(MYCFLAGS) -fPIC

你将-fPIC添加到最后。

现在似乎工作得很好。

感谢Etan,但我接受catwell的答案,因为它最直接地导致了解决方案。

点赞
用户258523
用户258523

lua 团队默认情况下不支持共享库,因为在可移植的方式下做到这一点并不简单。如果您从 CentOS 获取 lua 的 srpm,您应该能够在其中找到他们对 lua 构建过程所做的修改,以生成他们打包和发送的共享对象。CentOS srpm 存在 vault.centos.org 上。

2013-12-30 22:35:38
用户204011
用户204011

看看 Arch Linux是怎样做的。你不应该触及 LUA_ROOT,但其余部分的补丁是良好的且相对容易理解的。

别忘了在 CFLAGS 中也加入 -fPIC(Arch软件包在这里做了这个)。

2013-12-31 00:15:58
用户1600978
用户1600978

@beigerac的答案也适用于lua-5.3.0。但是,它只是编译了liblua.so.5.3.0并在lua-5.3.0/src内建立符号链接。在执行sudo make install时,它没有像应该那样将.so文件复制到/usr/local/lib。因此,我在补丁中添加了内容,以便将.so文件复制到指定位置。

对于lua-5.3.0,这些补丁文件适用于我:

Makefile.patch

而对于src/Makefile:

src/Makefile.patch

将补丁文件复制到lua-5.3.0/和lua-5.3.0/src(分别)中,并像这样应用补丁:

cd lua-5.3.0/
wget https://gist.githubusercontent.com/dcarrith/899047f3a2d603b25a58/raw/7fa41ee5c0113ed721abe979c269afe48472baf5/Makefile.patch -O Makefile.patch --no-check-certificate
patch -l < Makefile.patch
unexpand Makefile > Makefile.unexpanded
mv Makefile.unexpanded Makefile

cd src/
wget https://gist.githubusercontent.com/dcarrith/6095183b8dc60c909779/raw/614d769d5b70b69b5d67cfb618696bfb906e2aca/src.Makefile.patch -O Makefile.patch --no-check-certificate
patch -l < Makefile.patch
unexpand Makefile > Makefile.unexpanded
mv Makefile.unexpanded Makefile

unexpand行是为了确保任何可能由补丁放置的空格都转换为制表符,以便make不会报 missing separator 错误。

2015-02-27 20:12:11
用户3384114
用户3384114

不需要打补丁,只需告诉 make 你的额外 cflags

lua-5.3.5$ make MYCFLAGS="-fPIC" linux
2018-11-29 16:52:24