2017-03-02 5 views
1

ソースからgtestをコンパイルしようとしています(既存のインストール済みバージョンを使用する代わりに)。私はcatkinベースのcmakeプロジェクトに取り組んでいます。gtestをcatkinでソースコンパイル

ソースコードをhttps://github.com/google/googletestから私のワークスペースに追加し、add_subdirectoryを含むフォルダを追加しました。私は、これは問題になりませんことを理解しgoogletest指示自体(https://github.com/google/googletest/tree/master/googletest#incorporating-into-an-existing-cmake-project)の他の記事から

CMake Error at src/test_env/GTest/googletest/cmake/internal_utils.cmake:151 (add_library): 
    add_library cannot create target "gtest" because another target with the 
    same name already exists. The existing target is a shared library created 
    in source directory "/usr/src/gtest". See documentation for policy CMP0002 
    for more details. 

、および:

はしかし、私は既存のGTESTでnameclashを取得します。

私はcatkinがgtestをどのように処理するかに問題があると考えます。そして、確かに、通常、私はインストールされたバージョンを使用することができます。しかし、誰もが同じ(バンドルされた)バージョンのgtestを使用していることを確認したい。

すべての提案とヒントが歓迎されます。

+0

'catkinがgtestをどのように処理するかに問題があると思います。 - Catkinには' add_subdirectory'を使って同じようにgtestが含まれています。しかし、同じプロジェクトは通常**同じソースツリーから2回**含まれることはできません。そういうわけで、あなたはそのエラーを受けます。 [その質問](http://stackoverflow.com/questions/42085151/cmake-conflict-with-multiple-gtest)と同様です。 – Tsyvarev

答えて

1

さて、エラーメッセージは実際にはかなり明確です。 cmakeの "ターゲット"は、 "ビルドによって生成されるもの"であり、ライブラリ、実行可能ファイル、またはその他のものです。ですから、問題は "gtest"という名前のターゲットを追加しようとしていることです。catkinはすでに同じことをしています。どちらもライブラリ "libgtest.so"を生成しますが、もちろんそれらのうちの1つしか同じフォルダに存在することはできません。ターゲット名をgoogletest/CMakelists.txtに変更して "あなたの" gtestの名前を変更することもできますが、それをしないことを強くお勧めします。

私の考えでは、特にあなたがリポジトリの異なるプロジェクトに別のビルドフラグを使用している場合、gtestは全く共有ライブラリであってはなりません。代わりに、基本的にはgtestのソースコードをフォルダに含めてから、ユニットファイルmain.cppにヘッダーファイルとソースファイルを含めます。 googletestには既にそのためのヘルパーが付属しています(src/gtest-main.cc)。

これは、私はそれを構築する方法を次のとおりです。

  1. (場合には、あなたがGitのを使用)にgitにサブモジュールとして、あなたがしたいGTESTバージョンを追加します。この方法では、リポジトリ内のすべてのプロジェクトに対して指定されたバージョンがあり、それを別のブランチで更新することができます。私はそのフォルダを "GTEST_DIR"と呼ぶでしょう。
  2. テストしたいhppあたり#include <gtest/gtest.h>、1、そしてあなたのtest.cpp#includehppcpp両方のことを、.cppファイルにあなたのユニットテストを書きます。これにより、テストと他のクラスとの分離が強制され、非常には、モックや偽のオブジェクトを持つ依存クラスを簡単に切り替えることができます。 gtest-main.ccに既にあるので、main()関数は必要ありません。
  3. は、このようなcmakeのマクロ書く:もちろん

    macro(add_gtest NAME FILES) 
    add_executable(my_gtest_$NAME 
        $FILES 
        GTEST_DIR/src/gtest.cc 
        GTEST_DIR/src/gtest-death-test.cc 
        GTEST_DIR/src/gtest-filepath.cc 
        GTEST_DIR/src/gtest-port.cc 
        GTEST_DIR/src/gtest-printers.cc 
        GTEST_DIR/src/gtest-test-part.cc 
        GTEST_DIR/src/gtest-typed-test.cc 
        GTEST_DIR/src/gtest-main.cc 
    ) 
    target_include_directories(my_gtest_$NAME GTEST_DIR/include) 
    endmacro() 
    

を、あなたは、これはより複雑またはより複雑にすることができ、それは要点です。もちろん、コンパイル時間はgtestを共有ライブラリとして使うよりもずっと長くなるでしょうが、実際にあなたのユニットが単体でテストされるようにしています。これは私の意見では非常に重要です。また、ccacheを使用すると、gtestオブジェクトファイルが変更されないため、このシナリオではコンパイル時間を大幅に改善できます。また、gtestはあなたが望むフラグで正確にコンパイルされていることを確認します。たとえば、同じクラスに対して2つの個別のユニットテストを作成できます.1つは例外を有効にし、もう1つは無効にします。

+0

詳細なソリューションをありがとうございます。私はそれがまさに私がする必要があると思います。 – cbandera

関連する問題