首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >autoconf:设置AC_CHECK_LIB编译器标志

autoconf:设置AC_CHECK_LIB编译器标志
EN

Stack Overflow用户
提问于 2015-07-13 18:21:10
回答 3查看 2.5K关注 0票数 5

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

我的代码依赖于几个库:

  • 一个我写的(我会叫libfoo)
  • 一个是第三方(我会打电话给libbar)
  • Eigen3 (它只是头文件)

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

我需要的旗子是

代码语言:javascript
复制
-std=c++11 (Got this taken care of)

代码语言:javascript
复制
-I/path/to/include/libfoo (or libbar, or Eigen3)

代码语言:javascript
复制
-L/path/to/lib/ (Where libfoo and libbar reside)

代码语言:javascript
复制
-lfoo

编译并链接到libfoo和libbar

问题是,我希望设置对libfoo和libbar及其标题的检查(我已经为Eigen3设置了一个检查)。问题是,像AC_CHECK_HEADERS和AC_CHECK_LIB这样的宏似乎不想包含所需的CPPFLAGS或LDFLAGS,不管我如何定义它们,所以配置步骤失败。

代码语言:javascript
复制
AC_LANG_PUSH([C++])
AC_CHECK_HEADERS([libfoo/foo.h], , [echo "Did not find libfoo headers"; exit -1])
AC_LANG_POP([C++])

读取config.log显示,配置正在尝试使用

代码语言:javascript
复制
g++ -std=c++11 (other flags...)

但是由于上面缺少标志而失败(错误是“无法找到特征3/稠密”,或类似,指示缺少的-I标志)

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

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

EN

Stack Overflow用户

发布于 2015-07-15 15:47:33

你要做的就是:

-std=c++11 (搞定这件事)

使用11.m4很好

要使用它,您需要从上面的链接下载并在$(project_top)/m4/中设置它。

接下来,您在configure.ac中编写如下所示:

代码语言:javascript
复制
AX_CXX_COMPILE_STDCXX_11([noext], [mandatory])

而且,您可以在平台中检查是否可以使用C++11特性

代码语言:javascript
复制
$ autoreconf -vi -I m4
$ ./configure

-I/path/to/include/libfoo (或libbar,或Eigen3) -L/path/to/lib/ ( libfoo和libbar居住在其中) -lfoo

很难简单地解释,

  1. 库提供.pc文件。 您应该使用PKG_CHECK_MODULES宏 您应该参考pkg-config指南模块宏 这将有助于接收包含路径和库路径。
  2. 库提供foo-config shell。 例如,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 你可以参考标头利布
  4. 这个库是用C++编写的,什么都不提供 使用AC_TRY_LINK/AC_LANG_PUSHAC_LANG_POP如下..。 AC_MSG_CHECKING(for some_cpp_lib) AC_LANG_PUSH(C++) SAVE_LIBS="$LIBS“LIBS="$LIBS -lsome_cpp_lib”AC_TRY_LINK(#包括,SomeCppLib object;,has_some_cpp_lib=1,has_some_cpp_lib=0) AC_LANG_POP(C++),如果test $has_some_cpp_lib = 0;那么AC_LANG_POP(No)object(是) fi
票数 4
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31390648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档