0

Mac OSXでrapidjson0.11(http://code.google.com/p/rapidjson/ )のテストをビルドしようとしています。これには、gtest(正常にビルド)、unittest(ビルドが失敗)、perftest(ビルドが失敗)の3つのプロジェクトが含まれ、ビルド時にエラー1とエラー2でエラーが発生します。

コンパイラの出力には、unittestとperftestの両方で次のエラーが表示され、makeが失敗します。

../../include/rapidjson/reader.h: In function ‘const char* rapidjson::SkipWhitespace_SIMD(const char*)’:
../../include/rapidjson/reader.h:116: error: ‘_SIDD_UBYTE_OPS’ was not declared in this scope
../../include/rapidjson/reader.h:116: error: ‘_SIDD_CMP_EQUAL_ANY’ was not declared in this scope
../../include/rapidjson/reader.h:116: error: ‘_SIDD_BIT_MASK’ was not declared in this scope
../../include/rapidjson/reader.h:116: error: ‘_SIDD_NEGATIVE_POLARITY’ was not declared in this scope

これらのプリプロセッサ定数は、SSE4命令に関連しています。RapidjsonはSSE2またはSSE4.2を使用して速度を上げることができ、デフォルトではビルド時にSSE4.2を使用します。

makefileには、SSE4.2サポートを有効にするための-msse4.2コンパイラスイッチが含まれています。ヘッダーファイルを調べると、OS Xでは、SSE4_1SSE4_2の両方のプリプロセッサ定数をSIDD ...定数として定義する必要があることがわかります。定義されています。何らかの理由で、これらのSIDD ...定数は定義されていません。

さらなる調査により、-msse4スイッチがSSE4.1とSSE4.2の両方のサポートを有効にすることがわかったので、スイッチを-msse4に変更しようとしましたが、それでもエラーが発生します。

-msse4.2スイッチがSSE4_2を自動的に定義するかどうかはわかりません、手動で定義しようとしましたが、うまくいきませんでした。

注:Macで自分でビルドしてみたい場合は、付属のpremakeスクリプトファイルが機能しないため、別のpremakeスクリプトファイルをダウンロードする必要があります。修正されたスクリプトは、こちらの2番目の投稿の添付ファイルからダウンロードできますhttps://code.google.com/p/rapidjson/issues/detail?id=54

OS Xで正常に構築する方法についてのアイデアはありますか?

4

1 に答える 1

1

簡単な答え--msse4.2フラグをサポートしていない古いバージョンのgcc(4.2)がありました(gcc 4.3で導入されました)。

gccの最新バージョンにアップグレードした後、上記の問題は解消されました。

  1. ターミナルを開いて実行することにより、gccのどのバージョンがアクティブであるかを確認しますgcc -v
  2. ご使用のバージョンのOSX用のMacProstインストーラーをhttp://www.macports.org/install.phpからダウンロードし、インストーラーを実行します(GCCバージョンをアップグレードする簡単な方法)
  3. 新しいターミナルウィンドウを開きます(MacPortsのインストール後にPATH環境変数が更新されるため、新しくなければなりません)
  4. すでにインストールされているgccのバージョンを確認しますport select --list gcc(注:新しいバージョンの一部はまだインストールされていない可能性があります。次の手順を参照してください)
  5. 最新バージョンのgcc(現時点ではgcc47)をインストールします(sudo port install gcc47ダウンロードには時間がかかります)
  6. もう一度実行port select --list gccすると、リストに新しいバージョンが表示されます(例mp-gcc47) 。
  7. この最新バージョンをアクティブなgccバージョンとして選択しますsudo port select gcc mp-gcc47
  8. gcc -vもう一度実行して、最新バージョンがアクティブであることを確認します

コンパイラをソートすると、release32用にrapidjsonをビルドしようとした最初の試みで、32ビットビルド用に__int128が定義されていないため、limitsヘッダーファイルに関するエラーが発生しました。Gnuの公式の見解は、自分でロールする必要があるというものです。詳細については、次のリンクの回答を参照してください。

32ビットバイナリのコンパイル:「__int128」の前に非修飾IDが必要です

release64またはdebug64用にビルドするとこの問題は解決しましたが、で修飾子をキャストすることに関する警告が原因でビルドに失敗しましたtest/unittest/readertest.cpp:187:4。makeファイルにはコンパイラフラグが含まれているため-Werror=cast-qual、これらの警告はエラーとして扱われました。unittestとperftestの両方のmakefileでこのフラグを削除すると、この問題は解決しました(理想的な解決策ではありませんが、ビルドしたかっただけです)。

/ usr / lib64フォルダーが存在せず、makefileにフラグが含まれていたため、リンカーの警告がまだありました-L/usr/lib64が、ビルドは引き続き成功しました。

成功-unittest_release_x64_gmakeとperftest_release_x64_gmakeの両方が問題なく実行されました!

注:rapidjsonのビルド手順は、ZIPアーカイブのreadmeファイルに含まれています。

于 2013-01-26T02:03:45.787 に答える