我正在尝试设置我的项目,以使用自动工具生成系统进行分发。然而,当涉及到包含一些额外的库时,我遇到了一个问题。
我的代码依赖于几个库:
这些都已经编译并安装在我的$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显示,配置正在尝试使用
g++ -std=c++11 (other flags...)但是由于上面缺少标志而失败(错误是“无法找到特征3/稠密”,或类似,指示缺少的-I标志)
我是自动工具的新手,所以我可能遗漏了一些显而易见的东西,但我已经阅读了大量的帮助和手册,到目前为止还没有弄清楚我需要做些什么来设置它。
相关:如果需要的话,我希望用户能够通过-with include(等)手动指定libfoo和libbar的位置,所以我还需要能够指定configure检测到这些库的位置。这是如何做到的呢?
发布于 2015-07-14 17:04:30
对于那些无意中发现同样情况的人,我通过查看另一个开源项目的autotools文件找到了我的答案:
首先,要添加--具有-x-include=选项标志,可以使用
AC_ARG_WITH第二,执行此检查的粗略过程包括首先检查您想要的头文件是否存在于您认为应该使用的位置。
AC_CHECK_FILE然后保存旧的CPPFLAGS,然后添加所需的include's。
AC_CHECK_HEADER最后,我对这个宏使用on-success参数,设置了一个变量,然后进行测试。如果为true,则使用用户指定的包含路径定义变量LIBFOO_INC。
最后,我还找到了宏AX_CXX_CHECK_LIB,它允许在C++库中检查库。它可以在交流档案中使用。
请注意,在我的例子中,我需要为CPPFLAGS和CXXFLAGS定义一些这些标志,因此这需要在某些地方手动设置它们。它可能并不总是影响人们,但这是一个潜在的问题。
发布于 2015-07-15 15:47:33
你要做的就是:
为
-std=c++11 (搞定这件事)
使用11.m4很好
要使用它,您需要从上面的链接下载并在$(project_top)/m4/中设置它。
接下来,您在configure.ac中编写如下所示:
AX_CXX_COMPILE_STDCXX_11([noext], [mandatory])而且,您可以在平台中检查是否可以使用C++11特性
$ autoreconf -vi -I m4
$ ./configure和
-I/path/to/include/libfoo (或libbar,或Eigen3) -L/path/to/lib/ ( libfoo和libbar居住在其中) -lfoo
很难简单地解释,
$CURLCONFIG --libs CURL_CFLAGS=$CURLCONFIG --cflags发布于 2015-07-15 11:23:07
我找到了使编译器和链接器标志正确的最简单的方法,那就是使用PKG_CHECK_MODULES,它在幕后使用pkg-config来让库提供正确的标志。
PKG_CHECK_MODULES([FOO], [foo >= 3])尽管你的里程可能不同..。
https://stackoverflow.com/questions/31390648
复制相似问题