3

我正在尝试编写一些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

4 回答 4

1

您会看到此错误,因为 speech_tools 中的 abort() 函数与标准强制 abort() 函数冲突。可能没有真正好的、干净的方法来解决这个问题。如果您自己编写了 EST_String.h,请以不同的方式命名该函数。

如果不是,请不要在同一个文件中包含 stdlib.h 和 EST_String.h。是的,这是限制和不好的,但你在这里的情况很糟糕。

于 2011-11-14T13:48:17.790 回答
0

这在今天仍然是一个问题。作为一种解决方法,我正在使用这段代码。这是丑陋和hacky,但得到它的工作:

extern "C" void abort_est() { abort(); }
#define abort abort_est
#include <festival.h>
#undef abort
于 2014-11-20T12:22:56.267 回答
0

这是一个非常基本的 c 错误。abort 的两个定义是冲突的,我会尝试删除该行EST_String.h并添加 a#include <stdlib.h>并查看它是否在此之后编译。

于 2011-11-14T13:46:26.800 回答
0

我不认为包括 stdlib 标头是问题所在。但是,您可能会通过在翻译单元中包含任何一个 <cstdlib> <stdlib.h>作为第一个标题来获得更好的效果

理由:以防万一中的定义<cstdlib>添加了 no-throw declspec。

所以我真的建议......只是摆弄那个。如果它不起作用(确保您没有冲突的包含或过时的预编译头),我建议只删除 EST_String.h 中的违规声明

于 2011-11-14T13:50:58.663 回答