我是自动工具的初学者,而且似乎无法弄清楚如何在自动工具中正确使用外部库。
这是我的目录层次结构。
.
├── 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查了几个小时都没有用。
最佳答案
搜索的问题在于/opt/acml5.3.1/gfortran
永远不会成为/usr/lib
,/usr/local/lib
等库(和标头)的标准(搜索)位置。最好的选择是通过--with-acml
显式提供此位置进行配置。AC_ARG_WITH
宏描述为here。假设使用test "x$with_acml" != xno
,您可以尝试将程序与 AC_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)
假设您已使用
LT_INIT
初始化了libtool支持,则可以通过$(ACML_LIBFLAGS)
变量将带有src/Makefile.am
的acml库添加到自己的LIBADD
中的库中,或通过LDADD
变量添加到可执行文件中。或<lib>_la_LIBADD
,<prog>_LDADD
。要使用
$(ACML_CPPFLAGS)
包含路径编译源,请将其添加到AM_CPPFLAGS
变量中。或<prog>_CPPFLAGS
变量。不知道
Makefile.am
的设置方式就很难具体说明。我知道它看起来很复杂-但最好是在第一时间正确设置基础架构。如果您还有其他问题,我会在答复中补充。