Как обрабатывать ошибку при компиляции GCC 4.7.0 с использованием GCC 6.2.1

Во-первых, двойные кавычки необходимы для интерполяции:

$ sed "s/2/${RED}2${BLUE}/" Hello.txt
1233[0;31m2233[0;34m53125213
233[0;31m2233[0;34m13532135
233[0;31m2233[0;34m3513125215

Однако управляющие последовательности ASCII содержат символы, которые влияют на sed, поэтому необходимо преобразовать управляющую последовательность символов в фактические управляющие символы. Это можно сделать с помощью вложенной оболочки. Обратите внимание на конечное /g, означающее, что в строке разрешено несколько замен.

$ sed "s/2/`echo $RED`2`echo $BLUE`/g" Hello.txt

coloured output 1

Теперь, это все еще не совсем правильно. На самом деле мы должны установить начало каждой строки синим цветом, а затем сделать так, чтобы каждая замена 2 начиналась красным цветом и заканчивалась синим. Символ шляпы, ^, является регулярным выражением, означающим начало строки. Также обратите внимание на трубы и перестановку, чтобы использовать cat.

$ cat Hello.txt | sed "s/^/`echo $BLUE`/" | sed "s/2/`echo $RED`2`echo $BLUE`/g"

coloured output 2

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

$ BLUE=`echo '\033[0;34m'`
$ RED=`echo '\033[0;31m'`
$ cat Hello.txt | sed "s/^/$BLUE/" | sed "s/2/${RED}2${BLUE}/g"

Источник: http://www.cyberciti.biz/faq/unix-linux-sed-ascii-control-codes-nonprintable/

3
08.01.2017, 09:15
6 ответов

Скорее всего, вы потратите уйму времени на сборку GCC 4.7 на вашей текущей системе, и в итоге вы все равно не будете уверены в результате: версия GCC для компьютеров вашей школы может содержать исправления дистрибутива или даже локальные изменения, которых не будет в вашей версии.

Вместо этого я бы предложил запустить дистрибутив, который использует ваша школа, в виртуальной машине. Ваша школа использует RHEL, и вы тоже можете: вы можете получить бесплатную подписку для разработчиков от Red Hat Developers; после получения подписки вы можете загрузить ISO любой поддерживаемой версии RHEL, так что вы должны иметь возможность установить ту же версию, которая используется на школьных компьютерах.

В любом случае, поскольку это для оценки, вы всегда должны проверять свой код на школьных компьютерах перед отправкой!

3
27.01.2020, 21:12

Если посмотреть на опции configure для GCC, то можно успешно выполнить make, выдав ./configure --disable-werror, затем собрать GCC с помощью make -k.

Из man-страницы (make (1)):

 -k, --keep-going
            Continue  as much as possible after an error.  While the 
            target that failed, and those that depend on it, cannot be 
            remade, the other dependencies of these target can be 
            processed all the same.

После выполнения обоих этих действий для компиляции GCC 4.7.0 под GCC 6.2.1 на x86_64, похоже, компиляция прошла без проблем, однако на момент написания статьи компиляция не завершилась.

1
27.01.2020, 21:12

Я согласен с тем, что использование более новой версии gcc часто не является хорошим вариантом. Мне пришлось написать новую программу для встроенной системы ARM v4 под управлением Pengutronix, застрявшего на ядре 2.6 и старой glibc. Поэтому мне пришлось скомпилировать старый набор инструментов в моей системе.

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

Согласно журналу ошибок, объявление функции и заголовок функции не совпадают для

const char * libc_name_p (const char *, unsigned int);

в файле cfns.h, включенном в exclude.c

Отредактируйте cfns.h и измените объявление функции

#ifdef __GNUC__
__inline
#endif
const char * libc_name_p (const char *, unsigned int);
с

по

#ifdef __GNUC__
__inline
#ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char * libc_name_p (const char *, unsigned int);

Тогда компиляция должна работать.

6
27.01.2020, 21:12

Это просто "исправить" ошибку. После исправления появляется другая ошибка.

Чтобы это исправить-

В файле./gcc/cp/cfns.gperf строка 23 --26

#ifdef __GNUC__
__inline
#endif
const char * libc_name_p (const char *, unsigned int);

просто закомментируйте оператор ifdef.

Новая ошибка-

cp/except.o: In function `nothrow_libfn_p':
/home/user/Documents/build/gcc464objdir/gcc/../../gcc-4.6.4/gcc/cp/except.c:932: undefined reference to `libc_name_p'
collect2: error: ld returned 1 exit status
0
27.01.2020, 21:12

Однако я не являюсь решателем, после просмотра решения. Наконец, я могу следить за решением в другой ветке, опубликованной наhttps://github.com/cbrune/onie/commit/7b7331d45214435a93e604b92c54f05fcdca52b8

Исправьте файл 132 -build _gcc -5 _с помощью _gcc -6.patch, и сборка может продолжаться без проблем.

0
19.02.2020, 17:06

Чтобы расширить ответ @AxelBe :с более новым GCC, вам может потребоваться изменить в cfns.h как объявление функции, так и определение:

#ifdef __GNUC__
__inline
#endif
const char * libc_name_p (const char *, unsigned int);

или

#ifdef __GNUC__
__inline
#ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#endif
#endif
const char * libc_name_p (const char *, unsigned int);

-

#ifdef __GNUC__
#ifdef __GNUC_STDC_INLINE__
__attribute__ ((__gnu_inline__))
#else
__inline
#endif
#endif
const char * libc_name_p (const char *, unsigned int);

, чтобы избежать одновременного использования атрибутов __inlineи __gnu_inline__(, что приводит к ошибкеredeclared inline with 'gnu_inline' attribute). Это сработало для меня при компиляции GCC 5.3 с GCC 9.2.

2
08.03.2020, 13:41

Теги

Похожие вопросы