【问题标题】:'make' error: setting paths for compiling“make”错误:设置编译路径
【发布时间】:2013-05-16 15:37:40
【问题描述】:

我在编译netCDF库(并行版)时遇到了问题。

特别是问题与我猜的不同路径有关。 问题是我不是机器管理员。但是,管理员自己已经在自己的目录(此处:/root/treiber)中安装了旧版本。

我想在 /home/stephcar/bin 中安装自己的本地版本。

因此,我规定了具有不同编译器标志的目录:

CPPFLAGS=-I/home/stephcar/bin/include LDFLAGS=-L/home/stephcar/bin/lib LIBS='-L/home stephcar/bin/lib  -lnetcdf -L/home/stephcar/bin/lib -lhdf5_hl -lhdf5 -lz -lm -L/home/stephcar/bin/lib -lsz' CC=/home/stephcar/bin/bin/mpicc FC=/home/stephcar/bin/bin/mpif90  ./configure --enable-pnetcdf --prefix=/home/stephcar/bin/

此外:我还将我的 --prefix-path (/home/stephcar/bin/) 也放在 $PATH 和 $LD_LIBRARY_PATH 的第一个位置。

但是,由于某种原因,我无法弄清楚,搜索的是根目录 (/root/treiber) 而不是我的...这是来自“make”的错误:

/bin/sh ../libtool  --tag=CC   --mode=link /home/stephcar/bin/bin/mpicc  -g -O2  -L/home/stephcar/bin/lib -o liboc.la  
liboc_la-oc.lo liboc_la-daplex.lo liboc_la-dapparse.lo liboc_la-daptab.lo liboc_la- occlientparams.lo liboc_la-occompile.lo 
liboc_la-occurlfunctions.lo liboc_la-ocdata.lo liboc_la-ocdebug.lo liboc_la-ocdump.lo liboc_la-ocinternal.lo liboc_la-ocnode.lo
liboc_la-ochttp.lo liboc_la-ocrc.lo liboc_la-ocread.lo liboc_la-ocutil.lo liboc_la-ocbytes.lo liboc_la-oclist.lo liboc_la-ocuri.lo
liboc_la-oclog.lo liboc_la-xxdr.lo   -lpnetcdf -lm -L/home/stephcar/bin/lib  -lnetcdf  -L/home/stephcar/bin/lib -lhdf5_hl -lhdf5 
-lz -lm -L/home/stephcar/bin/lib -lsz

/usr/bin/grep: /root/treiber/hdf5-1.8.8/hdf5/lib/libhdf5_hl.la: Permission denied
/usr/bin/sed: can't read /root/treiber/hdf5-1.8.8/hdf5/lib/libhdf5_hl.la: Permission denied
libtool: link: `/root/treiber/hdf5-1.8.8/hdf5/lib/libhdf5_hl.la' is not a valid libtool archive
make[2]: *** [liboc.la] Fehler 1

你有什么想法吗?我是否设置错误的标志? 或者是否有另一个我没有看过的默认路径。 如何在模式后的默认路径中搜索(此处:/root/treiber)?也许我可以在这里得到一个提示!

谢谢斯蒂芬

编辑 澄清一下:netCDF 需要另一个库 hdf5,我已成功编译并安装到 ~/bin/lib 中。因此,丢失的 libhdf5_hl.la 也存储在那里。 实际问题是我的配置环境没有找到这个目录。相反,它会尝试使用 /root/ 中的那个。

【问题讨论】:

  • 指定--prefix=/home/stephcar/bin 会将二进制文件放在/home/stephcar/bin/bin 等目录中。您可能想要指定--prefix=/home/stephcar。我怀疑这是否与您的其他问题有关……或者,更有可能的是,您还没有遇到这个问题。话虽如此,您似乎还安装了带有该前缀的其他软件,所以也许这毕竟不是问题。
  • 不,我猜 --prefix-stuff 没问题。我试图在上面的主线程中澄清我的问题。 @jonathan-leffler

标签: compilation path makefile compiler-flags search-path


【解决方案1】:

首先,您通常不希望将bin 目录用作您的prefix。在 UNIX 中,bin 目录包含您运行的二进制文件:mkdirlsgcc 等命令。您不希望它包含bin/binbin/lib 等子目录。会工作,但它不是标准的。你应该使用--prefix=/home/stephcar,它将把东西放入/home/stephcar/bin/home/stephcar/lib等。或者更好的是,为这个包创建一个子目录并使用它:--prefix=/home/stephcar/netcdf或其他东西。

其次,我认为您的示例行中的这是一个错字:

LIBS='-L/home stephcar/bin/lib ...

(注意空格)你真的用过:

LIBS='-L/home/stephcar/bin/lib ...

第三,通常首选在configure 命令行而不是在其环境中设置这些变量;也就是说,将它们放在之后 configure 命令而不是之前:

./configure --enable-pnetcdf --prefix=/home/stephcar/bin CPPFLAGS=-I/home/stephcar/bin/include LDFLAGS=-L...

除此之外,此错误意味着您的构建正在 /root/treiber 子目录中找到 libhdf5_hl 库,该库不可读。我怀疑这个系统上的管理员做错了什么,并试图在一个地方构建这个库,然后以一种无效的方式将它复制到另一个地方。您还需要重建这个 HDF5 包,看起来像这样。

【讨论】:

  • 感谢您的回答。你是对的错别字。关于您的第一条评论,我确实有一个目录结构,其中包含 ~/bin/bin、~/bin/lib、~/bin/include、...这是一个问题吗?
  • 你说得对,目录 /root/treiber 对我来说是不可读的。但是,问题是如何为使用我的路径 ~/bin/.. 而不是 /root/treiber/ 来照顾 libhdf5_hl 库的 make 定义一个环境?我真的不知道为什么 make 根本就在看 /root。
  • 我真的忘了提(对不起!)我已经为自己构建了 hdf5-lib。这个在 ~/bin/lib 中可用。
  • 这本身不是问题,但它非常不标准,当你描述它时人们会觉得你很有趣:-)。众所周知,在bin 下创建某些目录会导致难以理解的错误。我怀疑是因为有人使用--prefix=/root/treiber 构建了该包,然后将生成的库复制到/usr/lib/usr/local/lib 之类的全局位置,所以正在寻找/root 目录。这不酷。 Libtool 对这样的东西有点刻薄。找不到您的 hdf5-lib 副本。检查 config.log 看看你是否能找出原因。
  • 我完全同意你的看法。不幸的是,我必须在这台机器上工作;(所以,感谢您的建议,即使在本地目录结构中也要避免使用“bin”。我以后会称之为 ~/software/bin 等。你怎么看。不幸的是,我无法更改根目录在他的目录中所做的事情......话虽如此,我还没有在 config.log 中找到任何建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 2011-12-28
相关资源
最近更新 更多