4

Qt Creator またはそのコンポーネントの 1 つに問題があります。

多くのメモリ (約 4 GB) を必要とするプログラムがあり、calloc を使用してメモリを割り当てています。(Qt フレームワークを使用せずに) mingw/gcc で C コードをコンパイルすると動作しますが、mingw/gcc ツールチェーンを使用して Qt Creator 内でコンパイルすると (C++ を使用して Qt フレームワークに埋め込まれた C コードを使用) 、calloc は null ポインターを返します。

すでに検索して見つけた qt-pro オプションQMAKE_LFLAGS += -Wl,--large-address-awareは、いくつかのケース (約 3.5GBytes) で機能しましたが、4GBytes を超えると、Qt ではなく gcc でコンパイルされた C コードでのみ機能します。

Qt Creator でコンパイルするときに calloc を使用して必要な量のメモリを割り当てるにはどうすればよいですか?

4

1 に答える 1

1

したがって、cigwinツール チェーンは 64 ビット アプリケーションをビルドします。64 ビット アプリケーションで割り当てることができるメモリの可能なサイズは、4Gb をはるかに超える2 64バイトです。しかし、Qt Creator (QtSDK からインストールし、手動で再構成していない場合) は、32 ビット アプリケーションをビルドする Qt のツール チェーンを使用します。理論的には、32 ビット アプリケーションで 4Gb のメモリを割り当てることができますが、すべてのライブラリもこのメモリにロードされることを忘れないでください。実際には、1 つの連続したチャンクではなく、約 3 GB のメモリを割り当てることができます。

問題を解決するには、次の 3 つの方法があります。

  • アルゴリズムを再考してください。4Gb の RAM を割り当てたり、よりスマートなデータ構造を使用したり、ディスク キャッシュを使用したりしないでください。問題を解決するために実際に4 GB を超えるメモリが必要な場合は、この質問をしないと思います。

  • Qt コードを C プログラムから分離します。その後、C プログラムには 64 ビット ターゲット コンパイラを、Qt/C++ 部分には 32 ビット ターゲット コンパイラを引き続き使用できます。任意のプロセス間通信メカニズムを介して C プログラムと通信できます。(実際には標準の入出力ストリームで十分な場合が多い)

  • 64 ビットに移行します。つまり、C コードと C++ コードの両方に 64 ビット ターゲット コンパイラを使用します。しかし、考えられるほど単純ではありません。Qt を 64 ビット モードで再構築する必要があります。一部のモジュールをオフにし、一部のコードを修正することで可能ですが (私は一度試しました)、Windows 64 ビットは公式にはサポートされていません

于 2012-09-27T17:08:43.190 に答える