链接共享库Autotools

时间:2013-08-13 17:15:51

标签: linker autotools autoconf automake

我是一个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的目录。当我没有autotools编译时,包括通常的编译器标志工作正常:

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查看了几个小时无济于事。

1 个答案:

答案 0 :(得分:5)

搜索问题是/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是如何设置的话,很难具体说明。我知道它看起来很复杂 - 但最好是第一次正确使用基础设施。如果你还有其他问题,我会加上答案。