autoconf:设置 AC_CHECK_LIB 编译器标志

autoconf: Set AC_CHECK_LIB compiler flags

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

我的代码依赖于几个库:

这些都已经编译安装在我的$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

进行编译和 link

问题是我想设置检查 libfoo 和 libbar 及其 header 是否存在(我已经设置了 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 正在尝试使用

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

但由于缺少上面的标志而失败(错误是 "Cannot find Eigen3/dense",或类似的,表示缺少 -I 标志)

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

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

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

首先,要添加 --with-x-include=option 标志,您使用

AC_ARG_WITH

其次,进行此检查的粗略过程包括首先检查您想要的 header 文件是否存在于您说它应该使用的地方

AC_CHECK_FILE

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

检查 header
AC_CHECK_HEADER

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

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

中可用

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

我发现获得正确的编译器和链接器标志的最简单方法是使用 PKG_CHECK_MODULES,它在幕后使用 pkg-config 让库提供正确的标志。

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

虽然你的mileage may vary...

您需要做的是:

为了

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

很好用ax_cxx_compile_stdcxx_11.m4
使用需要从上面的link下载,然后在$(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 (or libbar, or Eigen3)
-L/path/to/lib/ (Where libfoo and libbar reside)
-lfoo

这个很难简单的解释,

  1. 库提供.pc文件
    你应该使用 PKG_CHECK_MODULES
    你应该参考 Guide to pkg-config and The PKG_CHECK_MODULES Macro
    这将有助于接收包含路径和库路径。

  2. 库提供foo-configshell
    比如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_HEADER , AC_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