2

大きなフレームワークの一部である単体テスト ファイルがあります。テストで使用しているフレームワーク クラスの一部は、テストに必要な値を返すためにモックアップされたバージョンです。つまり、自分の C ソース ファイルでフレームワーク クラスの一部を再定義しました。

リンカー ラインからフレームワーク ライブラリを削除する以外に、Linux で ld に強制的に独自のフレームワーク クラス オブジェクトを使用させる方法はありますか? 一部のフレームワーク オブジェクトを変更せずに使用しているため、ライブラリを実際に削除することはできません。

これはリンク エラーです。

MyClass::MyClass' build/Debug/GNU-Linux-x86/tests/tests/my_ut.o:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/exception:62: first defined here ../frameworklib.a(MyClass.o): In function /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../include/c++/4.4.5/bits/char_traits.h:250: MyClass の複数定義:

4

2 に答える 2

2

独自のフレームワーク クラスを含むオブジェクトまたはライブラリ ファイルは、 のコマンド ラインで大きなフレームワークのライブラリの前に配置しますが、ldそれらを使用するオブジェクト/ライブラリ ファイルの後に配置します。独自のフレームワーク クラスを大規模なフレームワークでも (同様に) 使用する場合は、うまくいきません。

エラー メッセージは、シンボルの最初の解決が からframeworklib.a行われ、再定義が で行われることを示していますmy_ut.o。これは、 のコマンドラインのframeworklib.a前に発生することを示唆しています。ただし、定義がヘッダー ファイル (C++) からも来ているように見えることは複雑な要因です。私は C++ の専門家ではありませんが、さまざまな場所でさまざまなインクルード ファイルを使用することにより、両方の定義が実際にアプリケーションに含まれていると考えられます。クラス定義を無効にしたい場合は、クラスのすべての出現が無効になるようにする必要があります。その場合は、時間をかけて同僚と話し合い、単体テストの優れた設計を考え出すことをお勧めします。my_ut.old

于 2013-04-04T23:02:39.977 に答える