由于链接器选项

时间:2016-12-09 23:48:53

标签: c++ autotools autoconf

我正在尝试测试C ++库,并且必须比AC_SEARCH_LIBS或AC_CHECK_LIB多做一些。但是,我的链接器对选项的顺序很挑剔(g ++版本5.4.0)。

我的configure.ac包含以下代码:

AC_LINK_IFELSE(
      [AC_LANG_PROGRAM([#include <api/BamReader.h>],  [BamTools::BamReader dummy])],
      [TEST_LIBS=="$TEST_LIBS -lbamtools"] [HAVE_BAMTOOLS=1],
      [AC_MSG_WARN([libbamtools is not installed])])

我知道Bamtools是安装在我的系统上的。这将产生负面结果:

checking api/BamReader.h usability... yes
checking api/BamReader.h presence... no
configure: WARNING: api/BamReader.h: accepted by the compiler, rejected by the preprocessor!
configure: WARNING: api/BamReader.h: proceeding with the compiler's result
checking for api/BamReader.h... yes
configure: WARNING: libbamtools is not installed <-- this line

经过一些调查后,它似乎是链接器选项的顺序。

conftest.cpp文件如下所示:

#include <api/BamReader.h>
int main () {
   BamTools::BamReader dummy;
   return 0;
}

autoconf宏正在调用

g++ -o conftest -g -O2 -I/usr/local/include/bamtools -L/usr/local/lib/bamtools -lbamtools conftest.cpp/tmp/ccZiV1J9.o: In function `main':
/home/kzhou/coding/tmp/conftest.cpp:24: undefined reference to `BamTools::BamReader::BamReader()'
/home/kzhou/coding/tmp/conftest.cpp:24: undefined reference to `BamTools::BamReader::~BamReader()'
collect2: error: ld returned 1 exit status

如果你通过将-lbamtools放到最后来切换顺序,那么链接器很高兴:

g++ -o conftest -g -O2 -I/usr/local/include/bamtools -L/usr/local/lib/bamtools conftest.cpp -lbamtools

我想知道AC_LANG_PROGRAM需要更新吗?请评论。到目前为止,我还没有找到解决这个问题的好方法。 请参考:

https://nerdland.net/2009/07/detecting-c-libraries-with-autotools/

1 个答案:

答案 0 :(得分:2)

这看起来就像是在错误的变量中传递库;如果你在LIBS中传递图书馆,它将处于正确的位置,因为autoconf是正确的。

现在,您粘贴的代码也有语法错误(使用==这是一个比较,而不是=这是一个分配),而且TEST_LIBS是一个逻辑错误您引用的特定帖子使用的变量。因此,这不是在任何订单中设置-lbamtools的原因。

save_LIBS=$LIBS
LIBS="$LIBS -lbamtools"
AC_LINK_IFELSE(
      [AC_LANG_PROGRAM([#include <api/BamReader.h>],  [BamTools::BamReader dummy])],
      [save_LIBS="$LIBS"; HAVE_BAMTOOLS=1],
      [AC_MSG_WARN([libbamtools is not installed])])
LIBS=$save_LIBS

这应该做你正在寻找的东西,虽然它仍然比它可能复杂一点。您可以使用AC_CHECK_TYPE来检查是否已定义BamTools::BamReader