Ubuntu 14.04.1 64位上的HDF5和GSL库问题

Ubuntu 14.04.1 64位上的HDF5和GSL库问题

我在安装软件时遇到FDTD错误MEEP在 Ubuntu 上。虽然我已经在我的系统(Ubuntu 14.04.1 64 位)上安装了,但hdf5-tools安装步骤返回libhdf5makeMEEP错误就像这样paste.bin 链接。我MEEP使用以下命令进行配置:

./configure --with-mpi --with-hdf5=/usr/lib/x86_64-linux-gnu/  > configure.out

然后我运行make,结果出现错误,之后无法运行make install。如果不指定--with-hdf5标志,配置脚本将返回以下警告:

configure: WARNING: Couldn't find the HDF5 library!! Switching to ...

安装了大量 HDF5 库后,问题神奇地解决了;但是,当我使用标志时,问题仍然存在--with-hdf5=/usr/lib/x86_64-linux-gnu/。但是,如果没有标志,一切都安装得完美无缺(我随后测试了程序并确认它按预期运行。)除了 GNU 科学库链接。我的问题如下:

  1. 如何从命令提示符中找到库的位置?在 HDF5 的情况下执行命令并找到以locate hdf5结尾的文件路径是否足够?.so.a
  2. 如何将GNU科学库引入配置并制作脚本?
  3. environmental variables LDFLAGS 目录CPPF标志LD_LIBRARY_PATH与配置有关,并制作识别这些库的脚本。我认为它们有,因为它们在MEEP 安装说明MEEP 安装教程如果有人能解释一下这些和锂离子电池变量与安装程序有关。

感谢您抽出时间,

PS:如果需要,我可以提供其他文件。我没有放配置脚本等,因为我不知道哪个是自动生成的,哪个不是(同样如此make)。

答案1

要很好地回答这个问题确实需要对 GNU 有透彻的了解autotools,而我并不具备这一条件:不过我希望这些评论会有所帮助。

特定构建的 configure 脚本是使用 在其 configure.ac 文件中生成的autoconf。反过来,configure.ac 使用标准宏来测试指定组件是否存在。在此特定情况下,configure.ac 为 GSL 库指定 AC_CHECK_LIB 测试,如下所示

  AC_CHECK_LIB(gsl, gsl_sf_bessel_Jn, [],
        [AC_MSG_WARN([Missing GNU GSL library...Bessel-function field initialization will not be supported.])])

AC_CHECK_LIB 的语法

AC_CHECK_LIB (library, function, [action-if-found], [action-if-not-found], [other-libraries])

执行检查的实际机制是conftest针对指定内容创建一个最小测试程序(功能 gsl_sf_bessel_Jn在库中libgsl,并尝试使用默认构建工具链接它。这样的最小程序可能看起来像

char gsl_sf_bessel_Jn();

int main() { return gsl_sf_bessel_Jn(); return 0; }

请注意,虚拟原型char gsl_sf_bessel_Jn()可能与实际函数的返回类型或参数列表无关 - 我们从不尝试跑步程序,我们只想知道它是否链接(即链接器是否能够解析库引用)。如果我们自己创建这样的源文件,我们可以看到它是如何工作的:

$ cat > conftest.c
char gsl_sf_bessel_Jn();

int main() { return gsl_sf_bessel_Jn(); return 0; }

Ctrl+D

正如预期的那样,如果我们尝试运行它没有链接 GSL 库,我们收到错误

$ gcc conftest.c
/tmp/ccWqFraS.o: In function `main':
conftest.c:(.text+0xa): undefined reference to `gsl_sf_bessel_Jn'
collect2: error: ld returned 1 exit status

然而即使我们明确地链接 libgsl我们发现

$ gcc conftest.c -lgsl
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgsl.so: undefined reference to `cblas_dasum'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgsl.so: undefined reference to `cblas_sger'
.
<snip>
.
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libgsl.so: undefined reference to `cblas_zdotu_sub'
collect2: error: ld returned 1 exit status

此时,需要注意的是,configure 脚本不知道为什么某个特定的测试失败了,仅此而已。这个例子中,由于我们没有链接下级libgslcblas库,所以失败了。

这说明了测试执行顺序的重要性:每次成功的测试都会导致将新发现的库添加到变量中$LIB以供后续测试使用。具体来说(如GSL 文档

在检查 libgsl 之前检查 libm 和 libgslcblas 非常重要,否则测试将失败。假设找到了库,则配置阶段的输出如下所示,

checking for cos in -lm... yes 
checking for cblas_dgemm in -lgslcblas... yes 
checking for gsl_blas_dgemm in -lgsl... yes 

如果找到该库,则测试将定义宏 HAVE_LIBGSL、HAVE_LIBGSLCBLAS、HAVE_LIBM 并将选项 -lgsl -lgslcblas -lm 添加到变量 LIBS。


meep 源码包在 libgsl 之前检查 libgslcblas,但它执行的具体检查是 AC_CHECK_FUNC 而不是 AC_CHECK_LIB

AC_CHECK_FUNC(cblas_cgemm, [], [AC_CHECK_LIB(gslcblas, cblas_cgemm)])

虽然表面上相似,但 AC_CHECK_FUNC 似乎不会在$LIBS成功时附加库;看来我们可以通过在 configure.ac 文件中为 libgslcblas 添加显式 AC_CHECK_LIB 来解决这个问题

# GNU Scientific Library
AC_CHECK_FUNC(cblas_cgemm, [], [AC_CHECK_LIB(gslcblas, cblas_cgemm)])
AC_CHECK_LIB([gslcblas],[cblas_cgemm])
AC_CHECK_LIB(gsl, gsl_sf_bessel_Jn, [],
   [AC_MSG_WARN([Missing GNU GSL library...Bessel-function field initialization will not be supported.])])

然后运行autoconf重新生成配置脚本

$ autoconf

运行后./configure报告确实找到了 GSL 库:

$ ./configure --prefix=/usr/local | grep gsl
configure: WARNING: Cannot find latex2html in your path!
configure: WARNING: FFTW needed for MPB
checking for cblas_cgemm in -lgslcblas... yes
checking for gsl_sf_bessel_Jn in -lgsl... yes

答案2

apt-get 安装软件包http://packages.ubuntu.com/存储库。Ubuntu 将所有软件包元数据缓存在计算机中。您可以使用以下命令搜索您的软件包。

sudo apt-cache search "package keyword"

在 ubuntu 包存储库中搜索 HDF5 库。

sudo apt-cache search "hdf5"

该命令将显示与 hdf5 相关的包。

安装相关的包给你。

sudo apt-get install package-name. 

主要你需要安装 hdf5-tools、h5utils 和 python-tables。

相关内容