C++ autoconf:设置AC_CHECK_LIB编译器标志

C++ autoconf:设置AC_CHECK_LIB编译器标志,c++,autotools,autoconf,automake,C++,Autotools,Autoconf,Automake,我正在尝试设置我的项目以使用autotools构建系统进行分发。然而,当涉及到包含一些额外的库时,我遇到了一个问题 我的代码依赖于几个库: 我写的一个(我会打电话给libfoo) 一个是第三方(我会叫libbar) Eigen3(只是头文件) 这些都已经编译并安装在我的$HOME目录中。我不需要在这个项目中构建它们 我需要的旗帜是 -std=c++11 (Got this taken care of) 及 及 及 编译并链接libfoo和libbar 问题是我想设置libfoo和libba

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

我的代码依赖于几个库:

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

  • 一个是第三方(我会叫libbar)

  • Eigen3(只是头文件)

这些都已经编译并安装在我的$HOME目录中。我不需要在这个项目中构建它们

我需要的旗帜是

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

编译并链接libfoo和libbar

问题是我想设置libfoo和libbar的存在性检查以及它们的头(我已经设置了一个针对Eigen3的检查)。问题是,像AC_CHECK_HEADERS和AC_CHECK_LIB这样的宏似乎不希望包含所需的CPPFagas或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...)
AC_CHECK_HEADER
但由于上面缺少标志而失败(错误为“找不到特征3/dense”或类似,表示缺少-I标志)

我是autotools的新手,所以我可能错过了一些明显的东西,但我已经阅读了大量的帮助和手册,到目前为止还没有弄清楚我需要做什么来设置它


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

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

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

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

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

g++ -std=c++11 (other flags...)
AC_CHECK_HEADER
最后,对该宏使用on success参数,设置了一个稍后测试的变量。如果为true,则使用用户指定的包含路径定义变量LIBFOO_INC

最后,我还发现了宏AxiCxxCuxGoMyLIB,它允许在C++库中进行库检查。可在


需要注意的是,在我的例子中,我需要为CPPFLAGS和CXXFLAGS定义其中一些标志,因此这涉及到在某些地方手动设置它们。它可能并不总是影响人们,但这是一个潜在的问题。

我发现正确设置编译器和链接器标志的最简单方法是使用
PKG_CHECK_MODULES
,它在后台使用
PKG config
让库提供正确的标志

 PKG_CHECK_MODULES([FOO], [foo >= 3])

尽管您的…

需要做的只是:

为了

-std=c++11(处理好了)

使用方便
要使用它,您需要从上面的链接下载它,并在$(project\u 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所在的位置)
-勒福

这很难简单解释,

  • 该库提供.pc文件
    您应该使用打包检查\u模块
    您应该参考和
    这将有助于接收包含路径和库路径

  • 该库提供了foo-configshell
    例如,libcurl提供curl-config,libxml2提供xml2-config。因此,我们可以使用这个shell获得include/lib路径

    CURL_LIBS=`$CURLCONFIG --libs`  
    CURL_CFLAGS=`$CURLCONFIG --cflags`  
    
  • 该库是用C编写的,不提供任何内容 您应该使用AC\u CHECK\u HEADER/AC\u CHECK\u LIB
    你可以参考一下

  • <> >用C++编写的库,不提供任何BR> 使用AC\u TRY\u LINK/AC\u LANG\u PUSHAC\u LANG\u 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
    
    AC\u MSG\u检查([对于某些cpp\u库])
    交流语言推送(C++)
    SAVE_LIBS=“$LIBS”
    LIBS=“$LIBS-lsome\u cpp\u lib”
    AC#u TRY_LINK([#include],
    [SomeCppLib对象;],
    有一些cpp lib=1,
    有_some_cpp_lib=0)
    AC_LANG_POP(C++)
    如果test$有\u some\u cpp\u lib=0;然后
    AC_消息_结果([否])
    其他的
    AC_消息_结果([是])
    fi
    

    显然,这将补充
    LDFLAGS
    ,以便通过链接器的
    -L
    路径参数提供位于偏僻位置的库。当使用
    AC\u CHECK\u LIB
    (或推荐的更好的
    AC\u SEARCH\u LIBS
    )确认库的存在时,是否会自动发生这种情况?o无论如何,尝试在
    configure.ac
    条目中指定库位置可能是不正确的,因为它更适合作为
    LDFLAGS=“-L/p/a/t/h”
    参数,用于
    configure
    以供最终用户/编译器使用……感谢您的#4。出于某种原因,当代码> ACSeXCHCHYLIB 正在测试C++文件时,AutoCADE DEVS没有看到包含C++头的合适。(或者,如果他们有,他们已经把它隐藏在手册里了,所以我很感激指针。)在我意识到这是一个C++的事情之前,我花了一个小时才把头发拔出来(我想,这只是因为它在<代码> GMP < /代码>中工作得很好,但是不是用<代码> GMPXX)。以此为指导编写m4脚本不到5分钟。哇!
    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