我在安装软件时遇到FDTD
错误MEEP
在 Ubuntu 上。虽然我已经在我的系统(Ubuntu 14.04.1 64 位)上安装了,但hdf5-tools
安装步骤返回libhdf5
make
MEEP
错误就像这样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 科学库链接。我的问题如下:
- 如何从命令提示符中找到库的位置?在 HDF5 的情况下执行命令并找到以
locate hdf5
结尾的文件路径是否足够?.so
.a
- 如何将GNU科学库引入配置并制作脚本?
- 做
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 (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。