2016-04-14 13 views
1

ユニットテストを書くために、静的ライブラリlibddrmgr.aの一部の関数をモックする必要があります。 gtest_ddrmaint_cmds.cppに疑似コードを実装し、gtest_ddrmaint_cmds.oにコンパイルします。 しかし、G ++プロンプト複数の定義エラーオブジェクトファイルと静的ライブラリリンク中:オブジェクトファイルとスタティックライブラリをリンクする際に複数の定義エラーが発生する

g++ -g -o ddrmainttest main.o gtest_ddrmaint_cmds.o /walker/external/3rdparty/google/gtest.a /walker/external/3rdparty/google/gmock.a /walker/src/build/SLES/lib/libddrmgr.a -lacl -lxml2 -lpthread -ldl -luuid -lz -lresolv -lcap -lrt --coverage 

/walker/src/build/SLES/lib/libddrmgr.a(ddrmgr.o): In function `DDR_Shutdown': 
/walker/src/ddrmgr/ddrmgr.cpp:110: multiple definition of `DDR_Shutdown' 
gtest_ddrmaint_cmds.o:/walker/src/gunittest/ddrmaint/gtest_ddrmaint_cmds.cpp:16: first defined here 
/walker/src/build/SLES/lib/libddrmgr.a(ddrmgr.o): In function `DDR_Init': 
/walker/src/ddrmgr/ddrmgr.cpp:38: multiple definition of `DDR_Init' 
gtest_ddrmaint_cmds.o:/walker/external/3rdparty/google/gmock-1.7.0/gtest/include/gtest/internal/gtest-internal.h:443: first defined here 
collect2: ld returned 1 exit status 
make: *** [ddrmainttest] Error 1 

を、私はまた、オブジェクトファイル内のいくつかのライブラリが所有する機能を無効にするためにOKだとそれがうまく動作するかどうかテストするためのデモプログラムを書きました。誰かがなぜ上記のエラーを引き起こすのか教えていただけますか?ありがとう!

+0

あなたの質問は何ですか?それは問題がどこにあるかを伝えます。 '最初にここに定義されています /walker/src/build/SLES/lib/libddrmgr.a'さらに詳しいヘルプが必要な場合は、コードを投稿してください。まったく別の人が誰かにあなたに話すことができると期待していますか? – xaxxon

+0

最も可能性の高い答えは、複写されたシンボルも定義されている同じ翻訳単位内のシンボルを参照する未解決のシンボルが存在し、その変換ユニットの包含を強制し、したがって重複するシンボル定義です。 –

+0

個々の機能を置き換えることはできません。オブジェクト全体(オブジェクト==ライブラリのメンバー)を置き換える必要があります。 –

答えて

1

C++で関数をモックするには、単純にそれらを再定義することはできません。あなたが経験したように、これはmultiple definitionリンカエラーにつながります。

リチャード・ホッジズ(Richard Hodges)のコメントでは、使用するライブラリ関数に薄いラッパーを記述し、それらのラッパーオブジェクト用のモックを作成する方法を示します。

よくGoogleのモックdocsで説明されています。

それはフリー機能(すなわち Cスタイルの関数または静的メソッド)を模擬するためにGoogleのモックを使用することが可能です。インターフェイス(抽象クラ​​ス)を使用するには、 コードを書き直すだけです。

代わりの直接フリー機能(たとえば、のOpenFile)を呼び出し、それを インタフェースを導入し、自由 関数を呼び出す具象サブクラスがあります:あなたのコードを開くためにFileInterfaceに話すべき

class FileInterface 
{ 
public: 
    ... 
    virtual bool Open(const char* path, const char* mode) = 0; 
}; 
class File : public FileInterface 
{ 
public: 
    ... 
    virtual bool Open(const char* path, const char* mode) 
    { 
    return OpenFile(path, mode); 
    } 
}; 

をファイル。これで機能を模擬するのは簡単です。

関連する問題