【问题标题】:Using library with different names within autoconf在 autoconf 中使用不同名称的库
【发布时间】:2010-12-06 14:29:47
【问题描述】:
我正在尝试构建一个具有 OpenSync 0.4(实际上是 0.3.9)依赖项的应用程序。
在项目的 configure.ac 中,opensync 库写为libopensync1。然而,这并不建立在我的 Gentoo 系统上。将 libopensync1 更改为 libopensync 确实为我解决了这个问题。
我用谷歌搜索,发现libopensync1 用于某些发行版,而libopensync 用于其他发行版。那么configure.ac这个问题怎么解决呢?
谢谢。
【问题讨论】:
标签:
autoconf
gentoo
pkg-config
【解决方案1】:
宏 AC_SEARCH_LIBS 可以满足您的需求。 (关于是否应该使用 pkg-config 存在很多激烈的争论。如果您选择依赖它,ptomato 提供了一种合理的方法。)只需将其添加到您的 configure.ac:
AC_SEARCH_LIBS([osync_mapping_new],[opensync1 opensync],[],
[AC_MSG_ERROR([找不到opensync])])
这将首先查找名为 opensync1 的库;如果
它没有找到,它会寻找 opensync。
使用 pkg-config 的主要缺点是大多数项目
依靠它实际上并不检查.pc提供的数据是否
文件是可靠的,因此配置可能会成功,但后续构建
将失败。用户始终可以设置 PKG_CONFIG=true
运行时配置并完全消除所有数据
由任何关联的 .pc 文件提供,通过以下方式设置 LIBS、CFLAGS 等
使用“老式”的方式。
不使用 pkg-config 的主要缺点是用户
必须以老式的方式设置 LIBS、CFLAGS 等。在实践中,
这很简单,所有 pkg-config 所做的就是移动
将单个 CONFIG_SITE 文件中的数据单独维护
每个包的 .pc 文件。
如果您确实使用 PKG_MODULE_CHECK,请致电
AC_CHECK_LIB 或 AC_SEARCH_LIBS 验证数据
.pc 文件由 PKG_CHECK_MODULES 定位
【解决方案2】:
我假设在您的 configure.ac 中发生这种情况的位置是在 PKG_CHECK_MODULES 调用中。
查看 libopensync 源,似乎libopensync1 是新名称,libopensync 是旧名称。因此,我们将使用 pkg-config 宏来查找较新的名称除非它不存在。
把这个放在你的configure.ac:
# Check if libopensync1 is known to pkg-config, and if not, look for libopensync instead
PKG_CHECK_EXISTS([libopensync1], [OPENSYNC=libopensync1], [OPENSYNC=libopensync])
稍后在您的PKG_CHECK_MODULES 通话中,将libopensync1 替换为$OPENSYNC。