添加AC_CHECK_LIB的路径

hfh*_*hc2 8 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"],
  [])
Run Code Online (Sandbox Code Playgroud)

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

AC_CHECK_LIB([cplex], [CPXcreateprob], [],
[
  AC_MSG_ERROR([Could  not find CPLEX library])
])
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*ell 16

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

configure LDFLAGS=-L/p/a/t/h
Run Code Online (Sandbox Code Playgroud)

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

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

LDFLAGS="$LDFLAGS $CPLEX_LIBS"     # this is a bug
Run Code Online (Sandbox Code Playgroud)

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

configure LDFLAGS='-Lpath1 -Lpath2' 
Run Code Online (Sandbox Code Playgroud)

而不是它的类型

configure --with-cplex=path1 --with-foo=path2
Run Code Online (Sandbox Code Playgroud)

后者使事情变得模糊,导致未受过教育的民众.我从来没有理解为什么人们喜欢在他们的构建中加入--with-lib =/p/a/t/h选项:它们没有提供任何有用的东西.