添加AC_CHECK_LIB的路径

时间:2012-04-17 21:53:59

标签: autotools

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

1 个答案:

答案 0 :(得分:16)

告诉配置脚本库所在的位置是用户的责任。用户可以使用许多选项,最常见的是:

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

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