AC_LANG_PROGRAM 由于链接器选项的顺序,链接器阶段失败
AC_LANG_PROGRAM failed the linker stage because of order of linker option
我正在尝试测试 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/
这看起来你在错误的变量中传递了库;如果您在 LIBS
中传递库,它将位于正确的位置,因为 autoconf 做正确的事情。
现在,您粘贴的代码也有语法错误(使用 ==
这是一个比较而不是 =
这是一个赋值),并且是一个逻辑错误,因为 TEST_LIBS
是您引用的特定 post 使用的变量。所以这不是在任何订单中设置 -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
。
我正在尝试测试 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/
这看起来你在错误的变量中传递了库;如果您在 LIBS
中传递库,它将位于正确的位置,因为 autoconf 做正确的事情。
现在,您粘贴的代码也有语法错误(使用 ==
这是一个比较而不是 =
这是一个赋值),并且是一个逻辑错误,因为 TEST_LIBS
是您引用的特定 post 使用的变量。所以这不是在任何订单中设置 -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
。