我正在 GNU/Linux 上开发一个 C++ 项目,我正在寻找一种方法来使用 Autotools 测试 IBM Informix 库的存在性和可用性 - 即编辑 configure.in
。我没有使用 Autotools 的经验,所以基本上我是从项目的 configure.in
et al. 脚本中学习并复制和更改我认为需要更改的地方。 IOW,我一直在改编 configure.in
中的现有文本。
到目前为止,我一直在成功使用 configure.in
中的 AC_CHECK_LIB
来测试某个库是否既存在又可用。但这似乎只适用于具有 functions 的库,而不是例如类。即,在测试 Informix 的 libifc++.so
库时失败:
AC_CHECK_LIB(ifc++, ITString,
INFORMIX_LIB="-L$INFORMIX_LIB_LOCATION/c++ -lifc++ -L$INFORMIX_LIB_LOCATION -L$INFORMIX_LIB_LOCATION/dmi -L$INFORMIX_LIB_LOCATION/esql -lifdmi -lifsql -lifasf -lifgen -lifos -lifgls -lifglx $INFORMIX_LIB_LOCATION/esql/checkapi.o -lm -ldl -lcrypt -lnsl",
echo "* WARNING: libifc++.so not found!"
INFORMIX_INC=""
INFORMIX_LIB=""
)
我也尝试过使用其他组合,如 ITString::ITString
等。
我在 Informix 的 API 中没有找到“纯”函数(即,在 C++ 类中没有上下文的函数)。所以我希望有一种方法可以在这种情况下使用 AC_CHECK_LIB
,或者有另一个 autoconf
/configure.in
“命令”这个特定的用途。
提前感谢您的反馈。
最佳答案
您发现了 autotools 的一个缺点,但实际上是无能为力的。 Autotools 检查库二进制文件中的符号名称,与 C 中函数的符号名称与函数名称相同的 C 不同,C++“修改”函数的符号名称以完成诸如函数重载之类的事情。更糟糕的是,C++ 甚至没有真正的“标准”修改约定,因此不同的 C++ 编译器可能会为同一个函数生成不同的符号名称。因此,自动工具无法以可靠的方式检查 C++ 符号名称。
您尝试使用的库是否有任何用 extern "C"
声明的函数?这会导致 C++ 编译器生成标准化的 C 样式符号名称,并且 autotools 将能够找到它们。
我在尝试检测 gtest 时遇到了这个问题和 gmock (Google 单元测试和对象模拟框架)与 Autotools,这就是我想出的:
# gtest has a main function in the gtest_main library with C linkage, we can test for that.
AC_CHECK_LIB([gtest_main], [main], [HAVE_GTEST=1] [TEST_LIBS="$TEST_LIBS -lgtest_main"],
AC_MSG_WARN([libgtest (Google C++ Unit Testing Framework) is not installed. Will not be able to make check.]))
# gmock has no functions with C linkage, so this is a roundabout way of testing for it. We create a small test
# program that tries to instantiate one of gmock's objects, and try to link it with -lgmock and see if it works.
if test "$HAVE_GTEST"
then
saved_ldflags="${LDFLAGS}"
LDFLAGS="${LDFLAGS} -lgtest -lgmock"
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <gmock/gmock.h>], [testing::Cardinality dummy])],
[TEST_LIBS="$TEST_LIBS -lgmock"] [HAVE_GMOCK=1],
[AC_MSG_WARN([libgmock (Google C++ Object Mocking Framework) is not installed. Will not be able to make check.])])
LDFLAGS="${saved_ldflags}"
fi
关于c++ - 如何在 configure.in 中测试 C++ 库的可用性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1021962/