LINUX.ORG.RU

Почему autoconf/automake не находит библиотеку?

 , ,


0

1

Столкнулся со странной проблемой. Понадобилось скомпилировать программку. Она достаточно давно написана и сборочные скрипты давно не менялись. Для работы требует библиотеки, которую, соответственно, нужно тоже собрать и установить. Сборка и того и другого реализуется с помощью autoconf/automake. До сих пор все это работало без проблем. Теперь понадобилось это поставить под ARM64. Сборка библиотеки проходит успешно. А при сборке программы configure не находит библиотеку. Библиотека на месте. nm показывает, что функция, указанная в AC_CHECK_LIB присутствует. Не знаю, имеет ли значение тип архитектуры, но днем ранее нормально собирал все это на intel-е. autoconf 2.69 automake 1.16.1 gcc 8.4.1. На arm-е autoconf 2.6.9 automake 1.16.2 gcc 9.3.1.

не находит библиотеку.

Меньше слов, больше дела. Где выхлоп autoconf,automake?

anonymous
()
Ответ на: комментарий от Harald
[goga@localhost bxfm-xmnl-0.89]$ aclocal
aclocal-default: warning: couldn't open directory 'm4': No such file or directory
[goga@localhost bxfm-xmnl-0.89]$ autoheader
[goga@localhost bxfm-xmnl-0.89]$ automake --add-missing --copy --foreign
configure.ac:11: installing './compile'
configure.ac:13: installing './config.guess'
configure.ac:13: installing './config.sub'
configure.ac:5: installing './install-sh'
configure.ac:13: error: required file './ltmain.sh' not found
configure.ac:5: installing './missing'
src/Makefile.am: installing './depcomp'
configure.ac: installing './ylwrap'
[goga@localhost bxfm-xmnl-0.89]$ autoconf
[goga@localhost bxfm-xmnl-0.89]$ 

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

это не всё, да и лучше autoreconf -i вызывать вместо этих команд

Harald ★★★★★
()
Ответ на: комментарий от Harald

Весь лог после configure не поместился, тут только первая половина.

This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by bxfm-xmnl configure 0.89, which was
generated by GNU Autoconf 2.69.  Invocation command line was

  $ ./configure 

## --------- ##
## Platform. ##
## --------- ##

hostname = localhost.localdomain
uname -m = aarch64
uname -r = 5.8.12-mp-alt1
uname -s = Linux
uname -v = #1 SMP Tue Sep 29 12:21:58 UTC 2020

/usr/bin/uname -p = unknown
/bin/uname -X     = unknown

/bin/arch              = unknown
/usr/bin/arch -k       = unknown
/usr/convex/getsysinfo = unknown
/usr/bin/hostinfo      = unknown
/bin/machine           = unknown
/usr/bin/oslevel       = unknown
/bin/universe          = unknown

PATH: /home/goga/bin
PATH: /usr/local/bin
PATH: /usr/bin
PATH: /bin
PATH: /usr/games


## ----------- ##
## Core tests. ##
## ----------- ##


....

configure:12015: checking for XCopyArea in -lX11
configure:12040: gcc -o conftest -g -O2   conftest.c -lX11   >&5
configure:12040: $? = 0
configure:12049: result: yes
configure:12064: checking for XtVaSetValues in -lXt
configure:12089: gcc -o conftest -g -O2   conftest.c -lXt  -lX11  >&5
configure:12089: $? = 0
configure:12098: result: yes
configure:12113: checking for XmCreateScrollBar in -lXm
configure:12138: gcc -o conftest -g -O2   conftest.c -lXm  -lXt -lX11  >&5
configure:12138: $? = 0
configure:12147: result: yes
configure:12162: checking for XmNlListAddRows in -lXmNl
configure:12187: gcc -o conftest -g -O2   conftest.c -lXmNl  -lXm -lXt -lX11  >&5
/usr/bin/ld.default: /usr/lib64/gcc/aarch64-alt-linux/9/../../../../lib64/libXmNl.so: undefined reference to `RCDrawItem'
collect2: error: ld returned 1 exit status
configure:12187: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "bxfm-xmnl"
| #define PACKAGE_TARNAME "bxfm-xmnl"
| #define PACKAGE_VERSION "0.89"
| #define PACKAGE_STRING "bxfm-xmnl 0.89"
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL ""
| #define PACKAGE "bxfm-xmnl"
| #define VERSION "0.89"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
| #define HAVE_STDLIB_H 1
| #define HAVE_STRING_H 1
| #define HAVE_MEMORY_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_STDINT_H 1
| #define HAVE_UNISTD_H 1
| #define HAVE_DLFCN_H 1
| #define LT_OBJDIR ".libs/"
| #define HAVE_LIBX11 1
| #define HAVE_LIBXT 1
| #define HAVE_LIBXM 1
| /* end confdefs.h.  */
| 
| /* Override any GCC internal prototype to avoid an error.
|    Use char because int might match the return type of a GCC
|    builtin and then its argument prototype would still apply.  */
| #ifdef __cplusplus
| extern "C"
| #endif
| char XmNlListAddRows ();
| int
| main ()
| {
| return XmNlListAddRows ();
|   ;
|   return 0;
| }
configure:12196: result: no
configure:12206: result: XmNl lib not found
configure:12211: checking for XmuConvertStandardSelection in -lXmu
configure:12236: gcc -o conftest -g -O2   conftest.c -lXmu  -lXm -lXt -lX11  >&5
configure:12236: $? = 0
configure:12245: result: yes
configure:12260: checking for magic_open in -lmagic
configure:12285: gcc -o conftest -g -O2   conftest.c -lmagic  -lXmu -lXm -lXt -lX11  >&5
configure:12285: $? = 0
configure:12294: result: yes
configure:12309: checking Xm/Xm.h usability
configure:12309: gcc -c -g -O2  conftest.c >&5
configure:12309: $? = 0
configure:12309: result: yes
configure:12309: checking Xm/Xm.h presence
configure:12309: gcc -E  conftest.c
configure:12309: $? = 0
configure:12309: result: yes
configure:12309: checking for Xm/Xm.h
configure:12309: result: yes

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

configure:12187: gcc -o conftest -g -O2 conftest.c -lXmNl -lXm -lXt -lX11 >&5

/usr/bin/ld.default: /usr/lib64/gcc/aarch64-alt-linux/9/../../../../lib64/libXmNl.so: undefined reference to `RCDrawItem'

Библиотека, которую ты конпеляешь - libXmNl? Тут, судя по выхлопу, configure пытается подцепить системную версию библиотеки, а не твою скомпилированную

Harald ★★★★★
()
Ответ на: комментарий от Harald

Библиотека, которую ты конпеляешь - libXmNl?

Она самая.

Тут, судя по выхлопу, configure пытается подцепить системную версию библиотеки, а не твою скомпилированную

/usr/lib64/gcc/aarch64-alt-linux/9/../../../../lib64/libXmNl.so

в итоге ведет к:

/usr/lib64/libXmNl.so

Не знаю, отчего такие загогулины. Непонятно, почеум не находится RCDrawItem, который никто искать не просил. К тому же это внутренняя, не экспортируемая из библиотеки функция.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от anonymous

Да у тебя же скрипт линковки потерян!

Можно поодробнее. Какие директивы искать на наличие/отсутствие. Я такие скрипты писал лет 10 назад. Уже все забыл.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от anonymous

Файл найди: ltmain.sh

Это понятно. Я имел в виду, какая директива отвечпет за его генерирование. Ладно, проехали. Надо, как уже говорилось, запускать autoreconf -i или добавить libtoolize.

Мне вот непонятно, зачем загрузчик ищет RCDrawItem? Ведь об этом никто не просит.

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

RCDrawItem была inline функцией. В этом была причина. Осталось не ясно:

  • почему это работало раньше (то ли на intel-е как-то это отличается от arm64, то ли что-то новенькое в gcc 9);
  • с какого хрена вообще загрузчик начинает искать неэкспортируемую функцию библиотеки и почему именно эту, а не какую-то другую из десятка функций.
zloy_starper ★★★
() автор топика
Ответ на: комментарий от anonymous

А «Семен Семеныч». Из нее вызываются функции из других библиотек. Линковщик это, похоже, не может переварить. А gcc < 9-ой версии, вероятно, просто плевал на директиву и в реальности ничего не инлайнил.

zloy_starper ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.