Компиляция FSL: "фатальная ошибка: libxml++/libxml++. H: такого файла или каталога нет"

Я понимаю, что это очень много, но я просмотрел все остальные ответы, и ни один из них не имеет отношения к мне.

Я пытаюсь скомпилировать программное обеспечение для нейровизуализации FSL из исходного кода (я должен, это не поддерживается в моем дистрибутиве Linux). Я следовал всем инструкциям, перечисленным здесь, и это примерно на 80% скомпилировано. Однако есть несколько модулей, которые не увенчались успехом, и все они, похоже, восходит к проблеме, пытающейся скомпилировать CiftiLib-master.

В соответствии с инструкциями, всякий раз, когда я пытаюсь запустить команду "make", она возвращает:

Makefile:34: warning: overriding recipe for target 'clean'
/home/thosvarley/Desktop/fslbuild/fsl/config/common/rules.mk:32: warning: ignoring old recipe for target 'clean'
gcc -c -Wall -ansi -pedantic -Wno-long-long     -m64  -g -O3 -fexpensive-optimizations -m64  -I/home/thosvarley/Desktop/fslbuild/fsl/extras/include/boost -g -DCIFTILIB_USE_XMLPP -I/home/thosvarley/Desktop/fslbuild/fsl/extras/include -I/home/thosvarley/Desktop/fslbuild/fsl/extras/include/libxml2 -I/home/thosvarley/Desktop/fslbuild/fsl/extras/include/libxml++-2.6 -I/home/thosvarley/Desktop/fslbuild/fsl/extras/lib/libxml++-2.6/include -I/home/thosvarley/Desktop/fslbuild/fsl/extras/include/boost -I./Common -I./Nifti -I./Cifti  -I. -I/include -I/home/thosvarley/Desktop/fslbuild/fsl/include  -o Common/XmlAdapter.o Common/XmlAdapter.cxx
In file included from Common/XmlAdapter.cxx:28:0:
Common/XmlAdapter.h:56:10: fatal error: libxml++/libxml++.h: No such file or directory
 #include "libxml++/libxml++.h"
          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:19: Common/XmlAdapter.o] Error 1

Так как я не пытаюсь скомпилировать один файл foo.c, а скорее создаю для программы много советов, которые я видел, не похоже, что это применимо ко мне. Я уже установил все различные пакеты libxml, которые предлагаются в других статьях (libxml2, libxslt1 и т. Д.).

Я не могу разобраться с сообщением об ошибке: я совсем не знаком с компиляцией программ на С (это мой первый серьезный набег на сборку из исходного кода). Заранее извиняюсь, если ответ очевиден, а я его просто не узнаю.

Я нахожусь на Antergos Linux (ядро Arch), из-за которого, возможно, и возникла проблема, так как все другие люди, которые спрашивали об этом, похоже, работают на Debian или Ubuntu.

1 ответ

Я пытался решить ту же проблему. Похоже, что libxml++ по умолчанию связан с FSL, а связанная версия не компилируется.

Решение № 1: Установите и используйте более старый компилятор (например, GCC 4.8), поскольку конфигурации проекта сделаны так, чтобы соответствовать этим старым компиляторам

Я не могу ручаться за это решение, так как сам не пробовал (потому что, очевидно, мне нравится усложнять себе жизнь), но это, вероятно, ваш лучший выбор.

Решение № 2: Исправить проблемы вручную

ПРИМЕЧАНИЕ. Это не комплексное решение, но оно может указывать правильное направление.

Ваша первая проблема, скорее всего, заключается в том, что компилятор, который вы используете по умолчанию, использует более новый стандарт C++, чем проект, который написан для компиляции. Это приводит к неявному преобразованию входных и выходных потоков в логические значения. Возможно, вам удастся решить эту проблему, возиться с флагами компилятора в конфигурациях make-файла, но, вероятно, проще просто исправить проблемные части кода. Соответствующие строки (FSL 5.0.11):

- extras/src/libxml++-2.34.0/libxml++/io/istreamparserinputbuffer.cc (line 42)
  return _input;
  SHOULD BE
  return static_cast<bool>(_input);

- extras/src/libxml++-2.34.0/libxml++/io/ostreamoutputbuffer.cc (line 32)
  return _output;
  SHOULD BE
  return static_cast<bool>(_output);

- extras/src/libxml++-2.34.0/libxml++/io/ostreamoutputbuffer.cc (line 39)
  return _output;
  SHOULD BE
  return static_cast<bool>(_output);

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

Следующая проблема заключается в том, что пути включения не определены для INC_XML++, INC_XML++CONF а также INC_XML2 в общей конфигурации make-файла. Скорее всего, это то, что по умолчанию используется в вашей системе, поскольку для версий GCC> 4.8 нет конфигураций. Изменить config/generic/externallibs.mk файл, добавив следующие строки (где именно вы добавляете это не важно):

# XML++
LIB_XML++ = ${FSLEXTLIB}
INC_XML++ = ${FSLEXTINC}/libxml++-2.6
INC_XML++CONF = ${FSLEXTLIB}/libxml++-2.6/include
INC_XML2 = ${FSLEXTINC}/libxml2

(Я добавил LIB_XML++ для хорошей меры, потому что путь lib был определен другими переменными в файле, но я не уверен на 100%, что это необходимо.)

Опять же, это то, что исправило это в моей системе. В зависимости от версии исходного кода, который вы скачали, он может отличаться для вас, но, по крайней мере, это отправная точка.

После исправления этих ошибок цель CiftiLib-master должна скомпилироваться. ОДНАКО, если ваша система похожа на мою, это далеко не единственная ошибка в процессе сборки. Глядя на build.log файл и поиск error: должен дать вам довольно хорошее представление о том, какие проекты приводят к каким ошибкам, и что может понадобиться для их исправления. Проблемы, вероятно, будут сходны по своей природе с проблемами CiftiLib.

Последний совет: если ваш libgd Проект не компилируется, посмотрите на error: сообщение. Вероятно, он жалуется на некоторые необъявленные идентификаторы (IMG_FMT_I420, PLANE_Y, PLANE_U, PLANE_V). Если вы префикс этих идентификаторов с VPX_, он должен работать. Причина, по которой это не удается, заключается в обновлении библиотеки, которое удаляет определения устаревших идентификаторов, заставляя пользователей использовать более новые префиксные идентификаторы.

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

Другие вопросы по тегам