Объявление void abort () вызывает различные исключения - PullRequest
3 голосов
/ 14 ноября 2011

Я пытаюсь написать некоторый код C++ (используя C ++ API) для Festival и застреваю при попытке компиляции.Вот как я вызываю g++:

g++ -Wall -pedantic -I../ -I../speech_tools/include/ helloFestival.C -o h -L../festival/src/lib/libFestival.a -L../speech_tools/lib/libestools.a -L../speech_tools/lib/libestbase.a -L../speech_tools/lib/libeststrings.a |& tee festival.runLog Ошибка, которую я получаю:

In file included from ../speech_tools/include/EST.h:48,
                 from ../festival/src/include/festival.h:47,
                 from helloFestival.C:4:
../speech_tools/include/EST_String.h:50: error: declaration of ‘void abort()’ throws different exceptions
/usr/include/stdlib.h:513: error: from previous declaration ‘void abort() throw ()’

Неправильная строка в EST_String.h будет выглядеть так:
extern "C" void abort(void);

Функцию main(), которую я использовал, можно найти здесь: festvox.org/docs/manual-1.4.3/festival_28.html#SEC133

Приведенные здесь инструкции по компиляции и компоновкете, которые я использовал.

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

  1. Как мне от этого избавиться?
  2. Почему я вижу эту ошибку?

Ответы [ 4 ]

1 голос
/ 14 ноября 2011

Вы видите эту ошибку, потому что функция abort () в speech_tools конфликтует со стандартной функцией abort (). Вероятно, нет действительно хорошего, чистого способа исправить это. Если вы сами написали EST_String.h, назовите функцию по-другому.

Если нет, не включайте stdlib.h и EST_String.h в один и тот же файл. Да, это ограничивает и плохо, но вы попали в дерьмовую ситуацию здесь.

0 голосов
/ 20 ноября 2014

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

extern "C" void abort_est() { abort(); }
#define abort abort_est
#include <festival.h>
#undef abort
0 голосов
/ 14 ноября 2011

Не думаю, что включение заголовка stdlib является проблемой.Тем не менее, вы можете получить лучший пробег от включения либо <cstdlib> или <stdlib.h> в качестве самого первого заголовка в ваших единицах перевода

Обоснование: на всякий случайопределение в <cstdlib> добавляет declspec без броска.

Так что я действительно предлагаю ... просто поиграть с этим.Если это не сработает в любом случае (убедитесь, что у вас нет конфликтующих включений или устаревших предварительно скомпилированных заголовков), я предлагаю просто удалить ошибочное определение в EST_String.h

0 голосов
/ 14 ноября 2011

Это очень простая ошибка c. Два определения для abort противоречивы. Я бы попытался удалить строку в EST_String.h и, возможно, добавить #include <stdlib.h> и посмотреть, скомпилируется ли она после этого.

...