すでに存在しているかなり大きなプロジェクトでは、gccコンパイラの最適化O1
を有効にしています。O1最適化を使用するとC++リンカエラーが発生する
このオプションがないと、すべてがビルド、リンク、および正常に動作します。 オプションを有効にすると、メインの実行可能ファイルがコンパイルされ、リンクされますが、単体テストの1つをリンクするときにリンカーエラーが発生します。
これらの2つのコンパイルの実行の間に、コードを変更したりファイルを作成したりせずに、O1
最適化フラグのみを使用しました。
私が手にエラーがある:
Configuration.a(Builder.o): In function `Builder::Create() const':
Builder.cpp:123: undefined reference to `Factory::Instance()'
どこリンク処理中に、この行に遭遇Builder.cpp
の(ライン123): CPPファイル
pObject = Factory::Instance()->CreateObject();
(リンカーエラーに加えInstance
関数のうち、CreateObject
関数からも1つを取得します)
E Factory
は、私は以下を参照してください。 ヘッダファイル
class Factory { public:
static Factory* Instance(); << rest of the file >>
そしてCPPファイル内
Factory* Factory::sInstance = 0;
Factory* Factory::Instance() {
// Check if this is the first call
if (sInstance == 0)
{
// Create only instance
sInstance = new Factory();
}
// Address of the instance
return sInstance; }
まず私がきれいにしようと、再構築し、それは何もしませんでした。 私はFactory.o
(1つは最適化なしで1つ)の使用済みシンボルのダンプを作成するためにnmを使用し、これらを比較しました。
一部の記号は削除されていますが、Factory::Instance()
は削除されていません。私はこの機能に関してアドレスが変更されたものを見ていますが、それが問題であるとは思わないでしょう。
また、私はいくつかの可能性を見つけましたが、私の問題に合ったものは見つかりませんでした。
誰でもこの問題を見つける方法のアイデアはありますか?
コンパイラのバージョン?どのようにコンパイルするのですか?あなたが変更したのはそれが唯一のものであることを確認しましたか(つまり、 '-O1'を取り戻すと、再びコンパイルされますか?) – us2012
スレッドセーフティや誤解を招くような名前付け(「Factory」は実際にはシングルトンのようなものです)が欠けていることを除けば、私が示したコードでは何も気にしません。'-O1'があなたが変更した唯一のものであれば、うまくいくはずです。 makefileに 'factory.cpp'や何かをコンパイルしない条件節がない限り、最適化がオンになっていますが、それはちょっとばかげているでしょう。 – Damon