4

私はWindows用のGTK+3.4.4をクロスコンパイルしているところです。GTK(ATK、Cairo、GDK Pixbuf、およびPango)のすべてのビルド依存関係をすでにクロスコンパイルし、それらをにインストールしました/usr/i686-w64-mingw32/

ただし、GTK自体をコンパイルしようとすると、次のエラーが発生します。

In file included from gdkrgba.c:31:0:
fallback-c89.c:40:1: error: expected identifier or '(' before 'sizeof'
fallback-c89.c:40:1: error: expected ')' before '==' token

の34〜44行目には次のものがgdk/fallback-c89.c含まれます。

34.  #ifndef HAVE_ISINF
35.  /* Unfortunately MSVC does not have finite()
36.   * but it does have _finite() which is the same
37.   * as finite() except when x is a NaN
38.   */
39.  static inline gboolean
40.  isinf (double x)
41.  {
42.      return (!_finite (x) && !_isnan (x));
43.  }
44.  #endif

sizeofGCCが' 'または' 'をどこで見つけているのか、私には少しもわかりません==。コンパイラがそのような不可解なエラーメッセージをスローするのはなぜですか?どうすれば修正できますか?


編集:これが実際のコマンドラインです:

/usr/bin/i686-w64-mingw32-gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I..
  -DG_LOG_DOMAIN="Gdk" -DGDK_COMPILATION -I.. -I../gdk -I..
  -DG_DISABLE_CAST_CHECKS -mms-bitfields
  -I/usr/i686-w64-mingw32/include/pango-1.0
  -I/usr/i686-w64-mingw32/include/glib-2.0
  -I/usr/i686-w64-mingw32/lib/glib-2.0/include
  -I/usr/i686-w64-mingw32/include/cairo -I/usr/i686-w64-mingw32/include/pixman-1
  -I/usr/i686-w64-mingw32/include -I/usr/i686-w64-mingw32/include/freetype2
  -I/usr/i686-w64-mingw32/include/libpng15
  -I/usr/i686-w64-mingw32/include/gdk-pixbuf-2.0 -O2 -Wall -mms-bitfields -MT 
  gdkrgba.lo -MD -MP -MF .deps/gdkrgba.Tpo -c gdkrgba.c -DDLL_EXPORT -DPIC -o
  .libs/gdkrgba.o

さらに編集:オプションを使用してコンパイルした後-E、次の前処理された出力をキャプチャしました...これは奇妙なことを説明していますsizeof

# 39 "fallback-c89.c"
static inline gboolean
((sizeof (double x) == sizeof (float) ? __fpclassifyf (double x) : sizeof double x)) == (0x0100 | 0x0400))
{
  return (!_finite (x) && !_isnan (x));
}

isinf私はそれがすでに定義されたマクロであると結論付けることができるだけです。上記の関数宣言で使用される場合は、単に拡張されています。

私の質問は今になります...なぜHAVE_ISINF定義されていないのですか?構成スクリプトに問題がありますか?


さらに別の編集:わかりました。そこで、文字列''を含むビルドツリー内のすべてを検索することにしHAVE_ISINF、次のインスタンスに遭遇しました。

  • autom4te.cache / traces.1

    m4trace:configure.ac:740: -1- AH_OUTPUT([HAVE_ISINF], [/* Define to 1 if you
      have the `isinf\' function. */
    @%:@undef HAVE_ISINF])
    
  • config.h.in

    /* Define to 1 if you have the `isinf' function. */
    #undef HAVE_ISINF
    
  • config.h

    /* Define to 1 if you have the `isinf' function. */
    /* #undef HAVE_ISINF */
    

驚いたことに、config.log`HAVE_ISINF'について言及することには何もありません。


(おそらく)最終編集:さらに調査を行ったところ、ここに文字列「isinf」が見つかりました:http autom4te.cache/output.0: //paste.ubuntu.com/1154478/

このコードはを参照しているので、その関数のソースac_fn_c_check_funcを掘り起こし、スクリプトが生成するサンプルをコンパイルしました。.c

test.c:25:6: warning: conflicting types for built-in function ‘isinf’
  [enabled by default]
/tmp/ccLYd1R8.o:test.c:(.text+0xc): undefined reference to `_isinf'
collect2: ld returned 1 exit status

isinf上記の私の説明はそれが単なるマクロであることを示唆しているので、これは奇妙です。

4

1 に答える 1

5

私はついにこれを見つけまし。要約すれば:

「isnan()とisinf()は関数ではなくC99マクロなので、これらにはAC_CHECK_FUNCSの代わりにAC_CHECK_DECLを使用してください。」

したがって、ソースにパッチを適用するようです。

于 2012-08-19T00:18:14.430 に答える