【发布时间】:2013-05-14 00:42:47
【问题描述】:
我需要以非 root 用户身份通过 CPAN 安装 Perl PDL library。
由于这个 SO 问题,用于非 root 的 CPAN 工作:How can I use CPAN as a non-root user?
现在,PDL 依赖于 FFTW 库。显然,当我需要这台机器的 64 位时,我的系统管理员安装了 32 位版本。
我基于 CPAN 安装期间的以下错误消息:
gcc -shared -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic FFTW.o -o ../../blib/arch/auto/PDL/FFTW/FFTW.so \
-lm -L/lib -L/usr/lib -L/usr/local/lib -L/usr/local/lib64 -L/lib64 -L/usr/lib64 -ldfftw -ldrfftw \
/usr/bin/ld: skipping incompatible /usr/local/lib/libdfftw.a when searching for -ldfftw
/usr/bin/ld: skipping incompatible /usr/local/lib/libdfftw.a when searching for -ldfftw
/usr/bin/ld: cannot find -ldfftw
现在我已经成功在$HOME/lib 中安装了fftw,确实是libdfftw.a。
问题是我无法让这个 gcc 编译实例使用本地安装的副本。
我尝试了以下方法:
- 在 .bash_profile 中设置 LD_LIBRARY_PATH,是的,导出它 -- 没有骰子。
- 在How can I set library and include paths for Makefile.PL for a single installation? 之后,我将
cpan中的o conf makepl_arg设置为:LIBS=-L/homedir/lib INC=-I/homedir/include-- 仍然没有骰子 - 我做了与第 2 步相同的操作,但
o conf mbuild_arg--- 再次,没有骰子。
这些尝试都没有对上面的gcc 行产生任何影响;没有使用-L 标志指定其他路径。
我还能在cpan 中尝试什么来让这个编译命令引用我的 fftw 副本?
更新 1
在进行任何更改之前,我应该补充一点,makepl_arg 是:
makepl_arg [INSTALLDIRS=site]
因此,我将makepl_arg 设置为:
makepl_arg [INSTALLDIRS=site LIBS=-L/homedir/lib INC=-I/homedir/include]
我在设置这些配置时没有执行o conf commit 以允许实验。我应该提交这些更改吗?
更新 2
我看到上面gcc 行中的那些-L 标志来自makefile,它本身似乎是由MakeMaker 制作的,我认为它正在读取文件'Makefile.PL'
【问题讨论】:
-
请仔细检查您在第 2 步中所做的操作。当你看到
o conf makepl_arg时你看到LIBS=-L/homedir/lib INC=-I/homedir/include吗? -
(第 3 步为
mbuild_arg使用了不正确的值,但 PDL 使用了makepl_arg,所以不是问题。) -
刚刚ikegami又试了一次,可惜问题依旧。
-
注意:PDL 不依赖于 FFTW 库,它是可选的。如果您需要 FFTW 支持,显然您需要它。否则,还有一些 PDL 的其他 FFT 组件。
-
好的,很好。至于
o conf commit,在做install PDL之前不退出是没有必要的。
标签: perl linker shared-libraries cpan fftw