autoconf:设置 AC_CHECK_LIB 编译器标志
autoconf: Set AC_CHECK_LIB compiler flags
我正在尝试设置我的项目以使用 autotools 构建系统进行分发。但是,在包含一些额外的库时我遇到了问题。
我的代码依赖于几个库:
我写的一个(我会调用libfoo)
一个是第三方(我叫libbar)
Eigen3(这只是 header 个文件)
这些都已经编译安装在我的$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
这个很难简单的解释,
库提供.pc文件
你应该使用 PKG_CHECK_MODULES 宏
你应该参考 Guide to pkg-config and The PKG_CHECK_MODULES Macro
这将有助于接收包含路径和库路径。
库提供foo-configshell
比如libcurl提供了curl-config,libxml2提供了xml2-config。因此,我们可以使用此 shell.
获得 include/lib 路径
CURL_LIBS=`$CURLCONFIG --libs`
CURL_CFLAGS=`$CURLCONFIG --cflags`
用 C 编写的库,不提供任何内容
你应该使用 AC_CHECK_HEADER/AC_CHECK_LIB
大家可以参考一下AC_CHECK_HEADER , AC_CHECK_LIB
用 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
我正在尝试设置我的项目以使用 autotools 构建系统进行分发。但是,在包含一些额外的库时我遇到了问题。
我的代码依赖于几个库:
我写的一个(我会调用libfoo)
一个是第三方(我叫libbar)
Eigen3(这只是 header 个文件)
这些都已经编译安装在我的$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,然后添加所需的包含。然后我可以使用
检查 headerAC_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
这个很难简单的解释,
库提供.pc文件
你应该使用 PKG_CHECK_MODULES 宏
你应该参考 Guide to pkg-config and The PKG_CHECK_MODULES Macro
这将有助于接收包含路径和库路径。库提供foo-configshell
获得 include/lib 路径
比如libcurl提供了curl-config,libxml2提供了xml2-config。因此,我们可以使用此 shell.CURL_LIBS=`$CURLCONFIG --libs` CURL_CFLAGS=`$CURLCONFIG --cflags`
用 C 编写的库,不提供任何内容 你应该使用 AC_CHECK_HEADER/AC_CHECK_LIB
大家可以参考一下AC_CHECK_HEADER , AC_CHECK_LIB用 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