4

我是一个 autotools 初学者,我似乎无法弄清楚如何正确使用 autotools 的外部库。

这是我的目录层次结构。

.
├── configure.ac
├── Makefile.am
├── README
└── src
    (source files)
    └── Makefile.am

库的名称是acml_mp并且默认情况下安装在/opt/acml5.3.1/gfortran64/lib. 还有一个称为/opt/acml5.3.1/gfortran64/include包含的目录。当我在没有自动工具的情况下编译时,包括通常的编译器标志可以正常工作:

g++ ... -L/opt/acml5.3.1/gfortran64_mp/lib -I/opt/acml5.3.1/gfortran64_mp/include -lacml_mp ...

在 configure.ac 中,我放置了AC_LIB_LINKFLAGS([acml_mp])我认为只处理-lacml_mp标志的命令。

基本上,最终目标是让 autoconf 搜索这个库,并让 automake 生成的 makefile 在编译时包含正确的链接/包含路径。最后,在手工编译的时候,总是需要LD_LIBRARY_PATH使用命令修改环境变量

Export LD_LIBRARY_PATH=/opt/acml5.3.1/gfortran64_mp/lib:$LD_LIBRARY_PATH

理想情况下,我希望避免让用户这样做。抱歉,如果此信息已经存在,我查看了 SO 和 Google 几个小时无济于事。

4

1 回答 1

5

搜索的问题在于,它永远不会成为诸如等/opt/acml5.3.1/gfortran库(和头文件)的标准(搜索)位置。可能最好的选择是通过配置显式提供此位置。/usr/lib/usr/local/lib--with-acml

此处描述了AC_ARG_WITH宏。假设,您可以尝试将程序与.test "x$with_acml" != xnoAC_LINK_IFELSE

AC_LANG_PUSH([C]) # or [Fortran]

ac_save_acml_CPPFLAGS="$CPPFLAGS" # or FCFLAGS instead of CPPFLAGS.
ac_save_acml_LIBS="$LIBS"

ac_acml_CPPFLAGS="-I${with_acml}/include"
ac_acml_LIBS="-L${with_acml}/libs -lacml_mp"

CPPFLAGS+="$ac_acml_CPPFLAGS"
LIBS+="$ac_acml_LIBS"

AC_LINK_IFELSE([AC_LANG_PROGRAM( ... some C or Fortran program ... )],,
               AC_MSG_FAILURE([couldn't link with acml]))

AC_LANG_POP

# we *could* stop here... but we might need the original values later.

CPPFLAGS="$ac_save_acml_CPPFLAGS"
LIBS="$ac_save_acml_LIBS"

AC_SUBST(ACML_CPPFLAGS, $ac_acml_CPPFLAGS)
AC_SUBST(ACML_LIBFLAGS, $ac_acml_LIBS)

假设您已经使用 初始化了 libtool 支持,您可以通过变量LT_INIT将 acml 库添加$(ACML_LIBFLAGS)到您自己的库中,或者使用变量添加到可执行文件中。或,分别。src/Makefile.amLIBADDLDADD<lib>_la_LIBADD<prog>_LDADD

要使用包含路径编译源代码$(ACML_CPPFLAGS),请将其添加到AM_CPPFLAGS变量中。或者<prog>_CPPFLAGS变量。

Makefile.am在不知道您的设置方式的情况下很难具体说明。我知道这看起来很复杂——但最好在第一时间就做好基础设施。如果您还有其他问题,我会添加到答案中。

于 2013-08-13T18:58:31.733 回答