我正在尝试为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
。