autoconf:设置AC_CHECK_LIB编译器标志

时间:2015-07-13 18:21:11

标签: c++ autotools autoconf automake

我正在尝试设置我的项目以使用autotools构建系统进行分发。但是,在包含一些额外的库时,我遇到了一个问题。

我的代码取决于几个库:

  • 我写的一篇(我打电话给libfoo)

  • 第三方(我将调用libbar)

  • Eigen3(只是头文件)

这些都已编译并安装在我的$ HOME目录中。我不需要将它们构建为该项目的一部分。

我需要的标志是

-std=c++11 (Got this taken care of)

-I/path/to/include/libfoo (or libbar, or Eigen3)

-L/path/to/lib/ (Where libfoo and libbar reside)

-lfoo

编译并链接libfoo和libbar

问题是我想设置检查libfoo和libbar及其标题的存在(我已经检查了Eigen3的设置)。问题是像AC_CHECK_HEADERS和AC_CHECK_LIB这样的宏似乎不想包含所需的CPPFLAGS或LDFLAGS,无论我如何尝试定义它们,因此配置步骤失败。

AC_LANG_PUSH([C++])
AC_CHECK_HEADERS([libfoo/foo.h], , [echo "Did not find libfoo headers"; exit -1])
AC_LANG_POP([C++])

读取config.log显示configure正在尝试使用

对头进行编译
g++ -std=c++11 (other flags...)

但由于上面缺少标记而失败(错误是"找不到Eigen3 /密度"或类似,表示缺少-I标志)

我是autotools的新手,所以我可能会遗漏一些显而易见的东西,但我已经阅读了大量的帮助和手册,到目前为止还没有弄明白我需要做些什么来设置这个。

相关:如果需要,我希望用户能够通过--with-libfoo-include(etc)手动指定libfoo和libbar的位置,因此我还需要能够指定configure检测这些库的位置。怎么办呢?

2 个答案:

答案 0 :(得分:4)

您需要做的就是:

有关

  

-std = c ++ 11(得到了照顾)

最好使用ax_cxx_compile_stdcxx_11.m4
要使用它,您需要从上面的链接下载并将其设置为 $(project_top)/ m4 /
接下来,您在 configure.ac

中写下如下
AX_CXX_COMPILE_STDCXX_11([noext], [mandatory])

并且exec,您可以检查是否可以在平台中使用C ++ 11功能

$ autoreconf -vi -I m4
$ ./configure

  

-I / path / to / include / libfoo(或libbar,或Eigen3)
  -L / path / to / lib /(其中libfoo和libbar驻留)
  -lfoo

这很难解释,

  1. 图书馆提供 .pc 文件
    您应该使用 PKG_CHECK_MODULES 宏 您应该参考Guide to pkg-configThe PKG_CHECK_MODULES Macro
    这将有助于接收包含路径和库路径。

  2. 该库提供 foo-config shell
    例如,libcurl提供 curl-config ,libxml2提供 xml2-config 。所以,我们可以使用这个shell获得include / lib路径。

    CURL_LIBS=`$CURLCONFIG --libs`  
    CURL_CFLAGS=`$CURLCONFIG --cflags`  
    
  3. 用C语言编写的库并没有提供任何内容 您应该使用 AC_CHECK_HEADER / AC_CHECK_LIB
    您可以参考AC_CHECK_HEADERAC_CHECK_LIB

  4. 用C ++编写的库并没有提供任何内容 使用 AC_TRY_LINK / AC_LANG_PUSH AC_LANG_POP ,如下所示......

    AC_MSG_CHECKING([for some_cpp_lib])
    AC_LANG_PUSH(C++)
    SAVE_LIBS="$LIBS"
    LIBS="$LIBS -lsome_cpp_lib"
    AC_TRY_LINK([#include <some_cpp_lib.hpp>], 
            [SomeCppLib object;],
            has_some_cpp_lib=1,
            has_some_cpp_lib=0)
    AC_LANG_POP(C++)
    if test $has_some_cpp_lib = 0; then
      AC_MSG_RESULT([no])
    else
      AC_MSG_RESULT([yes])
    fi
    

答案 1 :(得分:0)

对于那些偶然发现同样事情的人,我通过查看来自另一个开源项目的autotools文件找到了我的答案:

首先,要添加--with-x-include =选项标志,请使用

AC_ARG_WITH

其次,执行此检查的粗略过程包括首先检查您想要的头文件是否存在于您应该使用的位置

AC_CHECK_FILE

然后我保存旧的CPPFLAGS,然后添加所需的include。然后我可以使用

检查标题
AC_CHECK_HEADER

最后,使用该宏的on-success参数,我设置了一个我稍后测试的变量。如果为true,则使用用户指定的包含路径定义变量LIBFOO_INC。

最后,我还找到了宏AX_CXX_CHECK_LIB,它允许在C ++库中进行库检查。它可以在ac-archive

中找到

作为一个注释,在我的情况下,我需要为CPPFLAGS和CXXFLAGS定义一些这些标志,所以这涉及在某些地方手动设置它们。它可能并不总是会影响人们,但这是一个潜在的问题。