我在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的库搜索路径中。这有可能吗?

最佳答案

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

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

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

既然我已经辩称您不应该做您想做的事情,我将告诉您如何去做。 AC_CHECK_LIB将使用LDFLAGS中的值进行搜索,因此您可以执行以下操作:
LDFLAGS="$LDFLAGS $CPLEX_LIBS"     # this is a bug

这是错误的,因为您现在在LDFLAGS中有一个-l标志,但是-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选项:它们没有提供任何有用的东西。

关于autotools - 将路径添加到AC_CHECK_LIB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10199754/

10-16 19:17