编译 Lua - 创建 .so 文件?

9
我正在Centos 6.5上编译Lua 5.2.3,编译/安装正常。但是,我还需要另一个程序的开发库进行编译。通常,我会通过以下方式安装这些库:
yum install lua-devel

问题是安装了Lua 5.1共享库,而不是5.2.3版本的库。我可以使用Centos仓库中的Lua 5.1,但如果有人能帮我使最新版本工作起来(对于知道的人来说很简单),那么我会非常感激。对于我来说,Linux的makefiles还是有些困难的,你懂的...
编辑
我找到了这个网站 - http://lua-users.org/lists/lua-l/2006-10/msg00091.html - 很久以前它建议对makefiles进行一些更改,但现在运行它们时我得到了这个:
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-解决方案

好的,虽然我最初自己找到了这个模块,但是catwell的保证让我坚持下去。这是我所做的...

catwell's link中手动编辑Makefiles。很容易跟进(正如catwell建议的那样,忽略luaconf.h的修改)。

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

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

你正在将“-fPIC”添加到最后。
现在似乎工作正常。
感谢Etan,但我接受catwell的答案,因为它直接导致了解决方案。

1
能否请给这个问题投反对票的人说明原因?这是我第一次遇到这种情况,我很好奇自己做错了什么。 - David Wylie
你需要在ld调用中加上-fPIC。 - Etan Reisner
1
将Lua源代码编译到程序中要容易得多。Lua本身很小,在构建时目标不会有链接器问题(不会出现安装错误的Lua版本问题),而且您的程序可以选择自己的Lua编译时标志。 - dualed
这是为了Asterisk而寻找要链接的库。如果有任何偏离该构建过程的情况,恐怕我无能为力。 - David Wylie
4个回答

5

嗨 - 我仍然得到相同的错误: gcc -shared -ldl -Wl,-soname,liblua.so。-o liblua.so。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 -lm /usr/bin/ld:lapi.o:无法在制作共享对象时使用重定位R_X86_64_32对“luaO_nilobject_”进行重新编译;重新编译-fPIC lapi.o:无法读取符号:坏值 collect2:ld返回1个退出状态 - David Wylie
1
啊哈!我在编译行中添加了-fPIC(最终正确的方法),它起作用了!感谢这个指南(它是我找到的一个略微不同的变体)。我正在编辑帖子以展示我所做的。 - David Wylie
这个补丁真的很糟糕,因为它试图构建一个共享库,但并没有创建一组带有位置无关代码的对象文件。 - maxschlepzig
@maxschlepzig 这个软件包设置了CFLAGS,包括-fPIC。https://git.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/lua#n36 我修改了我的回答以使其更清晰明了。 - catwell

4
Lua团队默认情况下不包含对共享库的支持,因为以便携方式实现这一点并不简单。如果您从CentOS获取Lua的srpm,则应该能够在其中找到他们修改Lua构建过程以生成共享对象的方法,并打包和发布它们的信息。 CentOS的srpm可以在vault.centos.org上找到。

我在这里找到了源代码的rpm包(http://vault.centos.org/6.5/os/Source/SPackages/),但在创建.so文件的makefile中找不到任何内容。我假设已安装的-devel库是以不同的方式编译的,但我找不到该库的源代码rpm包。我可能需要考虑这超出了我的能力范围,回到5.1版本。 - David Wylie
“-devel”包是主包的子包之一。它们都只有一个srpm。你需要从srpm中获取lua-5.1.4-autotoolize.patch。这个补丁会修改原始构建文件,以便包含必要的自动工具魔法来构建共享库。 - Etan Reisner
谢谢你的指引,但是在运行了那个补丁之后,我对原始 makefile 的掌控力被复杂的结果文件所取代。 - David Wylie
谢谢,Etan。但我完全不懂这个。我希望有人可能已经做过,并可以轻松地向我展示如何做,但这无关紧要。显然对我来说太复杂了。 - David Wylie
Arch解决方案是一种简单的非可移植解决方案,适用于其设计的系统。这就是为什么Arch可以如此直接地做到这一点,他们不关心过度的可移植性。而Autotools则更复杂,因为它们涵盖了比仅构建共享库更广泛的事物范围。 - Etan Reisner
显示剩余2条评论

2
无需打补丁,只需告诉make您的额外cflags。
lua-5.3.5$ make MYCFLAGS="-fPIC" linux

2
@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。"

已经测试过,适用于lua-5.3.3(尽管必须手动编辑Makefile文件,但更改基本相同)。谢谢! - Andrew White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接