gpt4 book ai didi

autoconf/automake : conditional compilation based on presence of library?

转载 作者:行者123 更新时间:2023-12-03 23:20:16 25 4
gpt4 key购买 nike

我需要根据库的存在有条件地编译一些代码。使用 autoconf/automake 似乎这应该很容易,但我无法弄清楚。

例如,如果存在一个 PNG 库,我想包含使用它的代码。我的 configure.ac 有:

AC_CHECK_LIB([png], [png_create_write_struct_2])

我的 Makefile.am 有:
if USE_LIBPNG
libdev_la_SOURCES += png.c
endif

(将 png.c 添加到 libdev 的源列表中,以便对其进行编译)。

像 USE_LIBPNG 这样的 automake 条件需要在 configure.ac 中定义条件,所以我需要:
AM_CONDITIONAL([USE_LIBPNG], [test SOMETHINGOROTHER])

问题是,什么可以测试某些东西? AC_CHECK_LIB 定义了什么我可以测试?

AC_CHECK_LIB 的默认行为是定义一个可以在源代码中使用的符号(在 config.h 中),但这对 Makefile 没有帮助,因为 AM_CONDITIONAL 需要一个 shell 测试

我尝试覆盖默认的 AC_CHECK_LIB 行为,如下所示:
AC_CHECK_LIB([png], [png_create_write_struct_2], [HAS_LIBPNG=1])

之后我可以测试它:
AM_CONDITIONAL([USE_LIBPNG], [test "x$HAS_LIBPNG" = "x1"])

这很丑陋,但适用于 Makefile ……但会产生一个新问题:因为它丢弃了原来的 AC_CHECK_LIB 行为,并且我不再将符号添加到我需要的 config.h 中。

我一定遗漏了一些基本的东西,或者可能做错了。已经挖了几个小时,没有找到答案。

任何人?

最佳答案

如果您正在检查的图书馆供应 .pc用于 pkg-config 的文件,那么你最好使用 PKG_CHECK_MODULES以获得正确的标志。 libpng 执行以下操作:

(在 configure.ac 中)

PKG_CHECK_MODULES([libpng], [libpng12])

这使您可以访问变量 $(libpng_CFLAGS)$(libpng_LIBS)您要添加到 Makefile.am (可能在 AM_CFLAGS/ AM_CXXFLAGSLDADD 或其特定于目标的版本中)。

它也会引起 configure如果 libpng12.pc 则失败并出现错误没有找到。如果你想要 configure要继续,您需要将第三个和第四个参数提供给 PKG_CHECK_MODULES , 分别是 ACTION-IF-FOUNDACTION-IF-NOT-FOUND :

(在 configure.ac 中)
PKG_CHECK_MODULES([libpng], [libpng12], [HAVE_LIBPNG=1], [HAVE_LIBPNG=0])

现在,如果您需要 automake有条件,您可以执行以下操作:

(在 configure.ac 中)
AM_CONDITIONAL([USE_LIBPNG], [test "$HAVE_LIBPNG" -eq 1])

如果您还需要预处理器定义,您可以使用 AC_DEFINE像这样:

(在 configure.ac 中)
AS_IF([test "$USE_LIBPNG" -eq 1], [AC_DEFINE([USE_LIBPNG], [1], [Define if using libpng.])])

可能更好的是在 Makefile.am 中设置定义:

(在 Makefile.am 中)
AM_CPPFLAGS =
if USE_LIBPNG
AM_CPPFLAGS += -DUSE_LIBPNG
endif

但是,这会使您的命令行变得困惑,而 AC_DEFINE如果您使用 AC_CONFIG_HEADERS,可以将定义放在标题中.如果您使用 AM_SILENT_RULES([yes]),我想这并不重要或者不关心你的命令行是否整洁(老实说, automake 无论如何都会生成一些非常粗糙的命令行)。

关于好的说明 autoconf风格

根据检查是否成功来构建可选支持被认为是糟糕的形式(详见 this gentoo doc)。下面是我如何编码对 libpng 的可选支持:

(在 configure.ac 中)
# This is because the first PKG_CHECK_MODULES call is inside a conditional.
PKG_PROG_PKG_CONFIG

AC_ARG_WITH([libpng],
[AS_HELP_STRING([--with-libpng],
[support handling png files @<:@default=check@:>@])],
[],
[with_libpng=check])
AS_CASE(["$with_libpng"],
[yes], [PKG_CHECK_MODULES([libpng], [libpng12], [HAVE_LIBPNG=1])],
[no], [],
[PKG_CHECK_MODULES([libpng], [libpng12], [HAVE_LIBPNG=1], [HAVE_LIBPNG=0])])
AM_CONDITIONAL([USE_LIBPNG], [test "$with_libpng" != no -a "$HAVE_LIBPNG" -eq 1])

(在 Makefile.am 中)
if USE_LIBPNG
AM_CPPFLAGS += -DUSE_LIBPNG
AM_CFLAGS += $(libpng_CFLAGS)
LDADD += $(libpng_LIBS)
libdev_la_SOURCES += png.c
endif

如果您的图书馆没有 .pc文件

为了完整起见,下面是我如何检查没有 .pc 的库的方法。文件。我会跳过下面好的细节 autoconf风格。 AC_CHECK_LIB设置一个缓存变量,所以你可以测试它而不是替换 ACTION-IF-FOUNDAC_CHECK_LIB :

(在 configure.ac 中)
AC_CHECK_LIB([png], [png_create_write_struct_2])

# Then test:
AS_IF([test "$ac_cv_lib_png_png_create_write_struct_2" = yes], [HAVE_LIBPNG=1], [HAVE_LIBPNG=0])

# Or set conditional:
AM_CONDITIONAL([USE_LIBPNG], [test "$ac_cv_lib_png_png_create_write_struct_2" = yes])

恕我直言,如果你别无选择,你应该只这样做。

关于autoconf/automake : conditional compilation based on presence of library?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5176929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com