Google C++ Mocking Frameworkのインストールに苦労しています。 Sudo apt-get install google-mock
を正常に実行しました。次に、このサンプルファイルをコンパイルしようとしました
#include "gmock/gmock.h"
int main(int argc, char** argv) {
::testing::InitGoogleMock(&argc, argv);
return RUN_ALL_TESTS();
}
g++ -lgmock main.cpp
で、これらのエラーが表示されています
main.cpp:(.text+0x1e): undefined reference to `testing::InitGoogleMock(int*, char**)'
main.cpp:(.text+0x23): undefined reference to `testing::UnitTest::GetInstance()'
main.cpp:(.text+0x2b): undefined reference to `testing::UnitTest::Run()'
collect2: error: ld returned 1 exit status
リンカーがライブラリファイルを見つけることができないと思います。誰もこれを修正する方法を知っていますか?
さて、googlemockプロジェクトのウェブサイトからソースをダウンロードして提供されたREADMEに従って独自のバージョンを作成することで、gmockの使用を開始しました。
WebサイトからダウンロードZipを取得します。 http://code.google.com/p/googlemock/downloads/list
これを${GMOCK_ROOT}
と言うディレクトリに解凍します。次に、READMEの指示に従って:
cd ${GMOCK_ROOT}
mkdir build
cd build
g++ -I../gtest/include -I../gtest -I../include -I.. -c ../gtest/src/gtest-all.cc
g++ -I../gtest/include -I../gtest -I../include -I.. -c ../src/gmock-all.cc
ar -rv libgmock.a gtest-all.o gmock-all.o
したがって、${GMOCK_ROOT}/build
に独自のlibgmock.aがあります。実際にコンパイルするにはpthreadも必要なので、その後のコンパイルコマンドは次のようになります。
g++ -I${GMOCK_ROOT}/include/ main.cpp -L${GMOCK_ROOT}/build -lgmock -lpthread
libgmock-devはデフォルトのUbuntu 18.10リポジトリに含まれます。それ以外のUbuntuリリースでは、手動でダウンロードしてインストールする必要があります。
Sudo apt-get install libgmock-dev
cd /usr/src/gmock
Sudo mkdir build
Sudo cmake ..
Sudo make
Sudo cp *.a /usr/lib
Pavelの答えに文脈を与えるために、コンパイルされたGoogle Mockバイナリは、 here の理由により、Ubuntuパッケージと共に配布されません。この説明はGoogle Test向けですが、原則はどのC++ライブラリにも適用されます。
具体的には、次のとおりです。
初期には、make installを使用して* nixシステムにコンパイル済みのGoogle Testライブラリをインストールできると述べました。その後、マシンのすべてのユーザーがGoogle Testを再コンパイルせずにテストを作成できます。
これは良いアイデアのように思えましたが、やっかいな問題があります。すべてのユーザーは、インストールされたGoogle Testライブラリのコンパイルに使用したのと同じコンパイラフラグを使用してテストをコンパイルする必要があります。そうしないと、未定義の動作に遭遇する可能性があります(つまり、テストは奇妙な動作をする可能性があり、明白な理由もなくクラッシュすることさえあります)。
どうして? C++にはOne-Definitionルールと呼ばれるものがあるため、2つのC++ソースファイルに同じクラス/関数/変数の異なる定義が含まれており、それらを一緒にリンクすると、ルールに違反します。リンカはエラーをキャッチする場合としない場合があります(多くの場合、C++標準では違反をキャッチする必要はありません)。そうでない場合、予期せずデバッグが困難な奇妙な実行時の動作が発生します。
異なるコンパイラフラグを使用してGoogle Testとテストコードをコンパイルすると、同じクラス/関数/変数の異なる定義が表示される場合があります(たとえば、Google Testで#ifを使用するため)。したがって、あなたの健全性のために、事前にコンパイルされたGoogle Testライブラリのインストールを避けることをお勧めします。代わりに、各プロジェクトはGoogle Test自体をコンパイルして、Google Testとテストの両方に同じフラグが使用されるようにします。
元の問題は、google-mock
パッケージをインストールするとソースコードのみがインストールされ、サンプルアプリケーションをコンパイルしようとしたときにgmockライブラリが見つからなかったためです。