c++ - 如何在 configure.in 中测试 C++ 库的可用性?

标签 c++ autotools configure usability autoconf

我正在 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/

相关文章:

c++ - Automake 用于所有子目录中的共享库

linux - 使用 autotools 在替换文件中执行替换

c - pidgin 中缺少 gstreamer 和 farsight 依赖项

autotools - 如何将额外的自定义 ./configure autotools 选项传递给 Buildroot 包?

c - configure --disable-shared 是否适用于 tcl 8.6.3?需要静态libtcl8.6.a

c++ - 动态数组初始化

c++ - 在 Qt 资源系统 (qt 5.0.2) 中读取和写入文件

c++ - 如何动态查找并包含库

java - 为 JVM 编译 C 代码或在 JVM 中嵌入 C 运行时

c++ - 尝试将绘图分离到不同的视口(viewport)