Компиляция 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_
, он должен работать. Причина, по которой это не удается, заключается в обновлении библиотеки, которое удаляет определения устаревших идентификаторов, заставляя пользователей использовать более новые префиксные идентификаторы.
Это так далеко, как я пришел. Я полагаю, что через год вы все еще не будете этим обеспокоены, но я оставляю это здесь для потомков.