Ошибки при сборке octave

SLAX, Deep Style, ZenWalk

Модератор: Модераторы разделов

Аватара пользователя
Hephaestus
Сообщения: 3077
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Ошибки при сборке octave

Сообщение Hephaestus »

Собираю octave-5.2.0.
В процессе сборки возникает ошибка:

Shell

CXX libgui/qterminal/libqterminal/unix/libgui_qterminal_libqterminal_la-kpty.lo
In file included from ./config.h:2750:0,
from /usr/include/cmdline.h:47,
from /usr/include/define.h:48,
from /usr/include/util.h:56,
from libgui/qterminal/libqterminal/unix/kpty.cpp:77:
./oct-conf-post.h:96:1: ошибка: шаблон с привязкой C
template <typename T>
^
./oct-conf-post.h:98:1: ошибка: redefinition of «template<class T> void octave_unused_parameter(const T&)»
octave_unused_parameter (const T&)
^
In file included from ./config.h:2750:0,
from libgui/qterminal/libqterminal/unix/kpty.cpp:26:
./oct-conf-post.h:98:1: замечание: «template<class T> void octave_unused_parameter(const T&)» previously declared here
octave_unused_parameter (const T&)
^
Makefile:16463: ошибка выполнения рецепта для цели «libgui/qterminal/libqterminal/unix/libgui_qterminal_libqterminal_la-kpty.lo»
Указанные строки из oct-conf-post.h выглядят так:

Код: Выделить всё

95 #if defined (__cplusplus)
96 template <typename T>
97 static inline void
98 octave_unused_parameter (const T&)
99 { }
100 #else
101 #  define octave_unused_parameter(param) (void) param;
102 #endif
Что это за зверь такой - inline?
Судя по сообщению, строка 98 является "redefinition" для строки 96. Непонятно.
Кто-нибудь может разъяснить? А то я в плюсах почти никак.


Как это дело переписать, чтоб компилятор не ругался?
Если блок убрать полностью и оставить только

Код: Выделить всё

#  define octave_unused_parameter(param) (void) param;
то собирается без ошибок.

Самое интересное, что эта штука в таком виде присутствует на slackbuilds.org.
Значит, оно всё-таки собирается каким-то образом... Возможно, обновления какие-то нужны.
Только не знаю, какие.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16953
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Ошибки при сборке octave

Сообщение Bizdelnick »

Командную строку компилятора неплохо бы увидеть. make V=1, скорее всего.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3077
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Ошибки при сборке octave

Сообщение Hephaestus »

Bizdelnick писал:
26.05.2020 14:35
Командную строку компилятора неплохо бы увидеть.
Гм. Сложно.
Если начать с того места, на котором всё остановилось,
то получается вот это:
Spoiler

Shell

make[2]: вход в каталог «/src/projects/octave/octave-5.2.0»
preserving existing HG-ID file
/bin/sh config.status liboctave/mk-version-h.sh-tmp liboctave/mk-version-h.sh
config.status: creating liboctave/mk-version-h.sh-tmp
config.status: executing liboctave/mk-version-h.sh commands
/bin/sh config.status libinterp/corefcn/mk-mxarray-h.sh-tmp libinterp/corefcn/mk-mxarray-h.sh
config.status: creating libinterp/corefcn/mk-mxarray-h.sh-tmp
config.status: executing libinterp/corefcn/mk-mxarray-h.sh commands
/bin/sh config.status build-aux/subst-config-vals.sh-tmp build-aux/subst-config-vals.sh
config.status: creating build-aux/subst-config-vals.sh-tmp
config.status: executing build-aux/subst-config-vals.sh commands
/bin/sh config.status liboctave/external/mk-f77-def.sh-tmp liboctave/external/mk-f77-def.sh
config.status: creating liboctave/external/mk-f77-def.sh-tmp
config.status: executing liboctave/external/mk-f77-def.sh commands
/bin/sh ./libtool --tag=CXX --mode=compile g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I/usr/include/qt5/QtNetwork -I/usr/include/qt5 -I/usr/include/qt5/QtPrintSupport -I/usr/include/qt5 -I/usr/include/qt5/QtHelp -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5 -I/usr/include/qt5/QtGui -I/usr/include/qt5 -I/usr/include/qt5/QtSql -I/usr/include/qt5 -I/usr/include/qt5/QtXml -I/usr/include/qt5 -I/usr/include/qt5/QtCore -I/usr/include/qt5 -I./libgui/qterminal/libqterminal -I./libgui/src -fPIC -pthread -fopenmp -g -O2 -MT libgui/qterminal/libqterminal/unix/libgui_qterminal_libqterminal_la-kpty.lo -MD -MP -MF libgui/qterminal/libqterminal/unix/.deps/libgui_qterminal_libqterminal_la-kpty.Tpo -c -o libgui/qterminal/libqterminal/unix/libgui_qterminal_libqterminal_la-kpty.lo `test -f 'libgui/qterminal/libqterminal/unix/kpty.cpp' || echo './'`libgui/qterminal/libqterminal/unix/kpty.cpp
libtool: compile: g++ -std=gnu++11 -DHAVE_CONFIG_H -I. -I/usr/include/qt5/QtNetwork -I/usr/include/qt5 -I/usr/include/qt5/QtPrintSupport -I/usr/include/qt5 -I/usr/include/qt5/QtHelp -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5 -I/usr/include/qt5/QtGui -I/usr/include/qt5 -I/usr/include/qt5/QtSql -I/usr/include/qt5 -I/usr/include/qt5/QtXml -I/usr/include/qt5 -I/usr/include/qt5/QtCore -I/usr/include/qt5 -I./libgui/qterminal/libqterminal -I./libgui/src -fPIC -pthread -fopenmp -g -O2 -MT libgui/qterminal/libqterminal/unix/libgui_qterminal_libqterminal_la-kpty.lo -MD -MP -MF libgui/qterminal/libqterminal/unix/.deps/libgui_qterminal_libqterminal_la-kpty.Tpo -c libgui/qterminal/libqterminal/unix/kpty.cpp -fPIC -DPIC -o libgui/qterminal/libqterminal/unix/.libs/libgui_qterminal_libqterminal_la-kpty.o
In file included from ./config.h:2750:0,
from /usr/include/cmdline.h:47,
from /usr/include/define.h:48,
from /usr/include/util.h:56,
from libgui/qterminal/libqterminal/unix/kpty.cpp:77:
./oct-conf-post.h:96:1: ошибка: шаблон с привязкой C
template <typename T>
^
./oct-conf-post.h:98:1: ошибка: redefinition of «template<class T> void octave_unused_parameter(const T&)»
octave_unused_parameter (const T&)
^
In file included from ./config.h:2750:0,
from libgui/qterminal/libqterminal/unix/kpty.cpp:26:
./oct-conf-post.h:98:1: замечание: «template<class T> void octave_unused_parameter(const T&)» previously declared here
octave_unused_parameter (const T&)
^
Makefile:16463: ошибка выполнения рецепта для цели «libgui/qterminal/libqterminal/unix/libgui_qterminal_libqterminal_la-kpty.lo»
make[2]: *** [libgui/qterminal/libqterminal/unix/libgui_qterminal_libqterminal_la-kpty.lo] Ошибка 1
make[2]: выход из каталога «/src/projects/octave/octave-5.2.0»
Но это уже линковка, судя по всему.
Если смотреть именно компиляцию, то... не знаю, как это вытащить из общего потока сообщений.
Я так понимаю, это уже самый верхний уровень, когда все вложенные каталоги уже отработали.
Там по пути очень много всего собирается. И довольно долго.
Нужный кусок я просто не найду там. Я могу, конечно, лог сборки целиком сохранить, но это совсем уж неприличные объемы текста.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Zer0
Сообщения: 67

Re: Ошибки при сборке octave

Сообщение Zer0 »

Установлен ли lapack (3.9.0) и blas (3.9.0)?
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16953
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Ошибки при сборке octave

Сообщение Bizdelnick »

Hephaestus писал:
26.05.2020 16:27
Но это уже линковка, судя по всему.
Да нет, всё правильно, компиляция:
Hephaestus писал:
26.05.2020 16:27
libtool: compile:
Только понятнее не стало.
Пишут, что такая ошибка означает специализацию шаблона внутри блока extern "C". Надо ковыряться в коде, чтобы понять, откуда такое могло вылезти.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3077
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Ошибки при сборке octave

Сообщение Hephaestus »

Bizdelnick писал:
26.05.2020 18:56
Надо ковыряться в коде
Да ковырять-то, собственно, особо и нечего, вот она - цепочка-то:
в kpty.ccp
присутствует инструкция #include <util.h>, она подключает /usr/include/util.h,
в котором содержится блок extern C,
внутри которого #include "define.h" подключает /usr/include/define.h,
в котором #include "cmdline.h" подключает /usr/include/cmdline.h,
в котором включается config.h,
в котором включается oct-conf-post.h,
в котором и содержится этот самый шаблон.

Получается, что есть блок extern C,
внутри него несколько уровней вложенности хедеров,
в одном из этих хедеров содержится шаблон.
Таким образом, шаблон внутри блока extern C.
Это всё понятно.
Непонятно, что с этим делать.

Есть большие сомнения, что файлы
/usr/include/util.h, /usr/include/define.h, /usr/include/cmdline.h - это именно те файлы, которые нужны.
Все три файла входят в пакет iat - это
какой-то анализатор iso9660.
Вряд ли в апстриме octave имели в виду именно этот util.h (который потянул за собой остальные).
Но скрипт configure находит именно его, так как он расположен в правильном месте.

Удалил я временно пакет iat, запустил конфирурирование/сборку octave,
собралось без ошибок.

На мой взгляд, здесь явная коллизия имен хедеров.
Вообще, там указан libutil.h (тоже не очень понятно, какой именно),
и только если его нет, ищется util.h.
Но вероятно, для octave требуется не тот util.h, который для iso9660, а какой-то другой, и тогда нужно указывать более точный путь, а не просто #include <util.h>.
Либо это просто опечатка и файл на самом деле называется utils.h,
а такой файл есть в составе самой octave.
Но это вряд ли, так как в более ранней версии 4.4
эти включения выглядят точно так же.
С другой стороны, предусмотреть ситуацию, когда в какой-либо системе имеется какой-то там пакет iat,
содержащий похожий файл, практически невозможно.
Поэтому неудивительно, что в течение долгого времени никто не сталкивался с этой ошибкой.


Так или иначе причина неудачной сборки, можно сказать, выяснена.

Осталось разобраться, какой же util.h нужен на самом деле. И нужен ли вообще.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
bormant
Сообщения: 1232

Re: Ошибки при сборке octave

Сообщение bormant »

Hephaestus писал:
27.05.2020 00:38
Осталось разобраться, какой же util.h нужен на самом деле
Как вариант: сравнить вывод configure с и без.
Есть шанс, что в варианте "без" где-то станет "no" вместо "yes", а выше будет написано, что именно имелось в виду при проверке...
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 16953
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Ошибки при сборке octave

Сообщение Bizdelnick »

Hephaestus писал:
27.05.2020 00:38
Но вероятно, для octave требуется не тот util.h, который для iso9660, а какой-то другой, и тогда нужно указывать более точный путь, а не просто #include <util.h>.
А в исходниках есть какой-нибудь util.h? Попробуйте просто заменить угловые скобки двойными кавычками, может, прокатит.
Добавлено (10:19):
Хотя, наверное, всё проще: надо установить libutil.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3077
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: Ошибки при сборке octave

Сообщение Hephaestus »

bormant писал(а):
27.05.2020 02:28
Как вариант: сравнить вывод configure с и без.
Увы. Ничего определенного.

Shell

checking pty.h usability... yes
checking pty.h presence... yes
checking for pty.h... yes
checking libutil.h usability... no
checking libutil.h presence... no
checking for libutil.h... no
checking util.h usability... yes
checking util.h presence... yes
checking for util.h... yes
checking for library containing openpty... -lutil
ну или, соотвественно, "no".

Сама проверка находится в acinclue.m4

Код: Выделить всё

*)
        AC_CHECK_HEADERS([pty.h libutil.h util.h])
        AC_SEARCH_LIBS([openpty], [util],
          [AC_DEFINE(HAVE_OPENPTY, 1, [Define to 1 if openpty exists])])
        AC_CHECK_FUNCS([chmod chown ftruncate mmap munmap], [],
          [build_qt_gui=no
           warn_qt_lib_fcns="At least one of chmod, chown, ftruncate, mmap, and munmap not found; disabling Qt GUI"])
      ;;

В общем, я склоняюсь к мысли, что это для платформы Apple/FreeBSD/или_как_ее_там.
Во-первых, рядом крутится openpty, а это явно оттуда.
Во-вторых, на той платформе совершенно точно есть libutil.h (на linux я его не нашел).
В-третьих, рассматриваемый кусок кода выглядит так:

Код: Выделить всё

#ifdef Q_OS_MAC
# include <util.h>
#else
# if defined(HAVE_PTY_H)
#  include <pty.h>
# endif
# ifdef HAVE_LIBUTIL_H
#  include <libutil.h>
# elif defined(HAVE_UTIL_H)
#  include <util.h>
# endif
#endif
здесь напрашивается вывод, что весь блок должен
относиться к Q_OS_MAC.

То есть это должно выглядеть как-то так:

Код: Выделить всё

#ifdef Q_OS_MAC
# if defined(HAVE_PTY_H)
#  include <pty.h>
# endif
# ifdef HAVE_LIBUTIL_H
#  include <libutil.h>
# elif defined(HAVE_UTIL_H)
#  include <util.h>
# endif
#endif
Возможно, что изначально был только util.h, а когда добавляли альтернативные варианты,
слегка ошиблись с #ifdef. Либо подразумевалось, что эти libutil.h, util.h на иной платформе обнаруживаться не должны ни при каких условиях.
Это домыслы, но искать подтверждение по истории коммитов откровенно не хочется.
Bizdelnick писал:
27.05.2020 10:08
А в исходниках есть какой-нибудь util.h? Попробуйте просто заменить угловые скобки двойными кавычками, может, прокатит.
Как видите, всё несколько сложнее.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали: