2

で完全にコンパイルされるプロジェクトがありますgccが、GreenhillsIntegrity環境ではコンパイルできません。

問題は次の3つのファイルに要約されます。

MyVector.cpp // contains function testVector
MyVector.hpp // contains template vector<>
SomeFile.cpp

MyVector.hppベクトルのtemplate-classがMyVector.cpp含まれ、のテンプレートとは関係のないテスト関数が含まれていますMyVector.hpp

さて、でMyVector.hppvectorテンプレートを使用しているとSomeFile.cpp、どういうわけか、関数testVectorはに注入されSomeFile.cppます。での使用をやめると(もちろん、まだ使用vectorしていますが、テンプレートをインスタンス化していないだけです)、完全に機能します。SomeFile.cpp#include

さらに、関数に警告を挿入すると、コンパイル時にtestVectorコンパイラーが警告を表示しましたSomeFile.cpp

SomeFile.cppさらに、で物事を変更すると、ビルドシステムが再コンパイルされMyVector.cppます。

testVector関数をから削除MyVector.cppして新しいものに移動すると、NewFile.cppコンパイルされます。

いいえ、誤ってファイルを含めなかっcppたので、正直に言って、ファイルを再確認し、grepすべてのソースコードを編集しました。

何が起こっているのかわかりません。手がかりがあれば嬉しいです。

4

3 に答える 3

2

GreenHillsはEdisonDesignGroupフロントエンドを使用しており、ごく最近まで(たとえば、MULTI 5.0または5.2でさえ)、コンパイラーは--implicit_includeデフォルトでオンになっています。そのオプションのEdisonドキュメントは次のとおりです。

--implicit_include
--no_implicit_include
-B
     Enable or disable implicit inclusion of source files as a method of
     finding definitions of template entities to be instantiated. -B is
     equivalent to --implicit_include. The default behavior is specified
     by the configuration flag DEFAULT_IMPLICIT_TEMPLATE_INCLUSION_MODE.
     See the section of this chapter on template instantiation. This
     option is valid only in C++ mode.

--no_implicit_includeコンパイラのコマンドラインを渡すと、問題が修正される可能性が非常に高くなります。(それが失敗した場合は、-W0,--no_implicit_includeまたはを試してください:compiler.args=--no_implicit_include。どちらの場合も、ドライバーによる(多くの)検閲なしでオプションをフロントエンドに直接渡します。渡す--std--STD、役立つかもしれません。覚えていません。)

暗黙的な包含は、今日では非常に愚かな考えですが、90年代にテンプレート機能を提供するための便利な方法でした。今日、単一定義規則を満たすための標準的でよく知られた方法があり、この「暗黙の包含」ハックは、あなたのような法を遵守するC++tizensの邪魔になります。

さあ、続けて、プレリンクについて私に聞いてください... :)

于 2012-09-06T17:46:47.813 に答える
-1

「警告を挿入する」と言うとき、#pragmaディレクティブを使用していますか?#pragmaディレクティブは、実行時ではなく、コンパイル時に表示されることを目的としています。

関数「testVectorが注入されるSomeFile.cpp」と言うとき、これはどのように観察されますか?関数が以前に定義されたことを示すコンパイラまたはリンカのエラーが発生しますか?

Integrity OSの場合はgccをコンパイルしますか、x86 Linuxの場合はgccをコンパイルしますか?
整合性はLinuxとは大きく異なり、整合性プロジェクトのタイプが重要です。モノリシックIntegrityカーネルまたは動的ダウンロードをサポートするIntegrityカーネルを構築できます。さらに、IntegrityCおよびC++ランタイムライブラリはLinuxとは異なります。

于 2011-04-12T16:57:18.307 に答える
-2

ベクターをどのように実装していますか?これをMyVector.cppに実装し、MyVector.hppの最後にMyVector.cppを含めていると思います。この場合、SomeFile.cppにMyVector.hppを含めると、MyVector.cppを変更したときにSomeFile.cppの再構築がトリガーされます。プリプロセッサを介して実行し、testVector()がどこから含まれているかを確認することをお勧めします。

于 2010-09-15T19:57:01.090 に答える