fer*_*rgu 5 c++ automake autoconf autotools
我正在尝试设置我的项目以使用 autotools 构建系统进行分发。但是,当涉及到包含一些额外的库时,我遇到了问题。
我的代码依赖于几个库:
我写的一个(我会叫 libfoo)
一个是第三方(我将称之为 libbar)
Eigen3(这只是头文件)
这些都已经编译并安装在我的 $HOME 目录中。我不需要将它们构建为这个项目的一部分。
我需要的标志是
-std=c++11 (Got this taken care of)
Run Code Online (Sandbox Code Playgroud)
和
-I/path/to/include/libfoo (or libbar, or Eigen3)
Run Code Online (Sandbox Code Playgroud)
和
-L/path/to/lib/ (Where libfoo and libbar reside)
Run Code Online (Sandbox Code Playgroud)
和
-lfoo
Run Code Online (Sandbox Code Playgroud)
编译和链接 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++])
Run Code Online (Sandbox Code Playgroud)
阅读 config.log 显示 configure 正在尝试使用
g++ -std=c++11 (other flags...)
Run Code Online (Sandbox Code Playgroud)
但由于缺少上述标志而失败(错误是“找不到 Eigen3/dense”或类似的,表明缺少 -I 标志)
我是 autotools 的新手,所以我可能会遗漏一些明显的东西,但我已经阅读了大量的帮助和手册,但到目前为止还没有弄清楚我需要做什么来设置它。
相关:如果需要,我希望用户能够通过 --with-libfoo-include (等)手动指定 libfoo 和 libbar 的位置,因此我还需要能够指定 configure 检测这些库的位置。如何才能做到这一点?
对于任何偶然发现这个问题并想知道同样问题的人,我通过查看另一个开源项目的自动工具文件找到了答案:
首先,要添加 --with-x-include=option 标志,您可以使用
AC_ARG_WITH
Run Code Online (Sandbox Code Playgroud)
其次,执行此检查的粗略过程包括首先检查您想要的头文件是否存在于您所说的应该使用的位置
AC_CHECK_FILE
Run Code Online (Sandbox Code Playgroud)
然后我保存旧的 CPPFLAGS,然后添加所需的包含。然后我可以使用检查标题
AC_CHECK_HEADER
Run Code Online (Sandbox Code Playgroud)
最后,使用该宏的 on-success 参数,我设置了一个稍后测试的变量。如果为 true,我将使用用户指定的包含路径定义变量 LIBFOO_INC。
最后,我还找到了宏 AX_CXX_CHECK_LIB,它允许在 C++ 库中进行库检查。它可以在ac 存档中找到
请注意,就我而言,我需要为 CPPFLAGS 和 CXXFLAGS 定义其中一些标志,因此这涉及在某些地方手动设置它们。它可能并不总是影响人们,但它是一个潜在的陷阱。