我正在尝试为C ++库编写一个autoconf测试。我遵循了http://nerdland.net/2009/07/detecting-c-libraries-with-autotools/。我的支票看起来像这样:

SAVED_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS -lMyLib"
AC_LINK_IFELSE(
  [AC_LANG_PROGRAM([#include <mylibheader.hpp>],
    [MyLibNamespace::SomeObject obj()])],
  [TEST_LIBS="$TEST_LIBS -lMyLib"] [HAVE_MYLIB=1],
  [AC_MSG_ERROR([libMyLib is not installed.])])
LDFLAGS=$SAVED_LDFLAGS


测试失败。如果我检查config.log,问题似乎出在由autoconf给出的生成的编译命令进行检查:

g++ -o conftest -g -O2   -lMyLib conftest.cpp


如您所见,在所有输入和输出之后,-l参数不是最后。如果我从config.log复制并粘贴conftest.cpp代码,则可以使用以下命令进行编译:

g++ -o conftest -g -O2  conftest.cpp -lMyLib


autoconf怎么会出错?我该如何解决?

最佳答案

问题在于您是将-lMyLib添加到LDFLAGS而不是添加到LIBS。换句话说,改为执行以下操作:

SAVED_LIBS=$LIBS
LIBS="-lMyLib $LIBS"
AC_LINK_IFELSE(
  [AC_LANG_PROGRAM([#include <mylibheader.hpp>],
    [MyLibNamespace::SomeObject obj()])],
  [TEST_LIBS="$TEST_LIBS -lMyLib"] [HAVE_MYLIB=1],
  [AC_MSG_ERROR([libMyLib is not installed.])])
LIBS=$SAVED_LIBS


编辑:库的链接顺序很重要,因此我假设其他LIBS=可能依赖于其他库,因此我将MyLib行更新为在其他库(如果有)之前链接MyLib

10-08 13:44