当我制作 Perl 5.10.1 时出现一些错误,我发现一些相关的线程指出:
错误消息来自链接器,而不是编译器。您应该通过
-lm
在所有编译行的末尾放置一个来避免这种情况。
我的问题是我需要添加的编译行在哪里-lm
?
miniperlmain.o opmini.o perlmini.o
pp.o: In function `Perl_pp_pow':
pp.c:(.text+0x2daf): undefined reference to `pow'
pp.o: In function `Perl_pp_modulo':
pp.c:(.text+0x39fc): undefined reference to `floor'
pp.c:(.text+0x3a28): undefined reference to `floor'
pp.c:(.text+0x3a51): undefined reference to `fmod'
pp.o: In function `Perl_pp_atan2':
pp.c:(.text+0x89c5): undefined reference to `atan2'
pp.o: In function `Perl_pp_sin':
pp.c:(.text+0x8b62): undefined reference to `sin'
pp.o: In function `Perl_pp_int':
pp.c:(.text+0x9021): undefined reference to `floor'
pp.c:(.text+0x9091): undefined reference to `ceil'
pp.o:(.rodata+0x120): undefined reference to `cos'
pp.o:(.rodata+0x128): undefined reference to `sin'
pp.o:(.rodata+0x130): undefined reference to `sin'
pp.o:(.rodata+0x138): undefined reference to `exp'
pp.o:(.rodata+0x140): undefined reference to `log'
pp.o:(.rodata+0x148): undefined reference to `sqrt'
pp_pack.o: In function `S_pack_rec':
pp_pack.c:(.text+0x72b3): undefined reference to `floor'
pp_pack.c:(.text+0x72d6): undefined reference to `floor'
pp_pack.c:(.text+0x7303): undefined reference to `floor'
collect2: error: ld returned 1 exit status
make: *** [miniperl] Error 1
答案1
我在一台装有 MIPS 处理器并运行 GNewSense 4 的 Lemote 8089 笔记本电脑上构建 SPEC 基准测试套件中包含的 Perl 5.8 时遇到了同样的问题。Perl 构建失败,因为它lib/ExtUtils/t/Embed
在构建过程中运行测试时找不到数学库。错误消息看起来与您的几乎相同。
-lm
解决方案是通过以下方式传递链接器标志:
PERLFLAGS="-A libs=-lm -A libs=-ldl -A libs=-lc -A ldflags=-lm -A cflags=-lm -A ccflags=-lm -Dnoextensions=IPC/SysV -Dperl" \
CONFIGFLAGS="--build=mipsel-linux-gnu" ./buildtools
这里的诀窍是链接器标志被称为 Lowercase,ldflags
而不是LDFLAGS
像在许多其他软件包中那样。此外,添加标志是ldflags
通过使用-A
中的(可能意味着“附加”)指令来完成的PERLFLAGS
。
(第二个标志ldflags=-lm
解决了此处的问题,但可能两者都是libs
,并且ldflags
是整个 Perl 构建所必需的。)