【问题标题】:Linking a Shared Library Autotools链接共享库 Autotools
【发布时间】:2013-08-15 10:27:38
【问题描述】:

我是一名 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 几个小时无济于事。

【问题讨论】:

    标签: linker autotools autoconf automake


    【解决方案1】:

    搜索的问题在于 /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 支持,您可以通过 LIBADD 变量将带有 $(ACML_LIBFLAGS) 的 acml 库添加到您自己的 src/Makefile.am 库中,或者使用 LDADD 变量添加到可执行文件中。或<lib>_la_LIBADD<prog>_LDADD

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

    如果不知道您的Makefile.am 是如何设置的,很难具体说明。我知道这看起来很复杂——但最好在第一时间就做好基础设施。如果您还有其他问题,我会补充答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多