2012-04-17 3 views
6

У меня есть следующая проблема с configure.ac:Добавление пути к AC_CHECK_LIB

Я хотел бы добавить путь поиска библиотек, так как библиотеки я должен использовать в некоторых сумасшедших папках. Моя идея заключается в том, чтобы сделать это с помощью опции:

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. Это возможно?

ответ

14

Обязанностью пользователя является указание скрипта configure, где находятся библиотеки. Есть много вариантов, доступных для пользователя, с наиболее распространенными из которых является:

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

Там нет абсолютно никаких оснований для сопровождающего, чтобы изменить сценарии сборки на всех, чтобы разместить пользователь на данный момент, и много хороших причин не пытаясь что-либо сделать. Если вы (как пользователь) обнаружите, что ваши библиотеки находятся во многих местах, вы можете установить LDFLAGS в своей среде или в config.site. Возможно, у вашей инструментальной цепочки есть другие механизмы (например, если вы используете 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 опции в свои сборки: они ничего не дают.