8

我对 configure.ac 有以下问题:

我想添加一个库搜索路径,因为我必须使用的库位于一些疯狂的文件夹中。我的想法是通过一个选项来做到这一点:

AC_ARG_WITH([cplex-lib-path],
  [AS_HELP_STRING([--with-cplex-libs], [location of the CPLEX library])],
  [CPLEX_LIBS="-L$withval --lcplex"],
  [])

如果有人指定库路径,我当然想看看是否可以找到该库:

AC_CHECK_LIB([cplex], [CPXcreateprob], [],
[
  AC_MSG_ERROR([Could  not find CPLEX library])
])

但是,我想将 CPLEX_LIBS 添加到 AC_CHECK_LIB 的库搜索路径中。这有可能吗?

4

1 回答 1

18

告诉配置脚本库在哪里是用户的责任。有许多可供用户使用的选项,最常见的是:

configure LDFLAGS=-L/p/a/t/h

在这一点上,维护者完全没有理由修改构建脚本以适应用户,并且有很多很好的理由不尝试做任何事情。如果您(作为用户)发现您的库位于多个位置,您可以在您的环境或 config.site 中设置 LDFLAGS。您的工具链可能有其他机制(例如,如果您使用 gcc,您可以简单地设置 LIBRARY_PATH)。autoconf 提供的基础设施已经提供了很多机制来处理这个问题,包维护者最好不要重新发明轮子并提供非标准接口。

既然我已经争辩说你不应该做你想做的事,我会告诉你怎么做。AC_CHECK_LIB 将使用 LDFLAGS 中的值进行搜索,因此您可以执行以下操作:

LDFLAGS="$LDFLAGS $CPLEX_LIBS"     # this is a bug

这是错误的,因为您现在-l在 LDFLAGS 中有一个标志,但-l参数属于LIBS. 此外,如果您要让另一个库 libfoo 和 $FOO_LIBS 指向不同的位置,则根本无法消除歧义:LDFLAGS 将获得 -L/cplex 和 -L/foo 并且用户将不知道哪个首先出现,并且无法保证与一个库的链接优于另一个。简而言之,不要使用 CPLEX_LIBS:教育您的用户使用 LDFLAGS。此外,键入更方便:

configure LDFLAGS='-Lpath1 -Lpath2' 

而不是打字

configure --with-cplex=path1 --with-foo=path2

后者混淆了事物并导致未受过教育的民众。我一直不明白为什么人们喜欢在他们的构建中加入这些 --with-lib=/p/a/t/h 选项:它们没有提供任何有用的东西。

于 2012-04-18T13:27:37.283 回答