Linuxで共有ライブラリとしてgoogleTestを設定する方法


87

Debianは、gTest用のプリコンパイル済みパッケージを提供しなくなりました。フレームワークをプロジェクトのメイクファイルに統合することをお勧めします。しかし、メイクファイルをクリーンに保ちたいです。以前のバージョン(<1.6.0)のようにgTestを設定して、ライブラリに対してリンクできるようにするにはどうすればよいですか?


2
ところで、gtestビルドはautotoolsを使用して管理されるため、標準の./configure && make && make installワークフローは問題なく機能するはずです。ソースから他の多くのパッケージをコンパイルするのと同じであるため、これが投稿を正当化するかどうかはわかりません。
ショーンチン

7
すべてのユーザーがあなたほど経験豊富なわけではないと思います。私は最近WindowsからLinuxに移行しましたが、StackOverflowでこのようなものを見つけてよかったと思います。
ManuelSchneid3r 2012年

1
ライブラリをビルドせず、代わりにGTestコードをプロジェクトに含めることをGoogleが推奨していることに注意してください。code.google.com/p/googletest/wiki/を
Mawgは、

それが答えの最初のメモです。
ManuelSchneid3r 2015

1
@Mawgによって提供されたリンクが壊れています(wikiが削除されました)、それは機能しているように見えますが、もうトピックになっていないページを指しています(かなり混乱しています)。代わりに私が見つけることができる最高のものは、これらのビルド手順です:github.com/google/googletest/blob/master/googletest/README.mdただし、これはcmakeでビルドする方法を説明しているだけです。:autotoolsのために、私は最高の仕事を次のように答えたstackoverflow.com/a/36000856/1487069
カルロ・ウッド

回答:


143

始める前に、読んで理解したことを確認してください 、Googleからのこのメモ。このチュートリアルでは、gtestの使用が簡単になりますが、厄介なバグが発生する可能性があります。

1.googletestフレームワークを取得します

wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz

またはそれを取得します 。私はこの小さなハウツーを維持しませんので、あなたがそれに遭遇し、リンクが古くなっている場合は、それを編集してください。

2.グーグルテストを開梱してビルドします

tar xf release-1.8.0.tar.gz
cd googletest-release-1.8.0
cmake -DBUILD_SHARED_LIBS=ON .
make

3.システムにヘッダーとライブラリを「インストール」します。

この手順はディストリビューションごとに異なる可能性があるため、ヘッダーとライブラリを正しいディレクトリにコピーしてください。私はDebianの以前のgtestライブラリがどこにあるかをチェックすることによってこれを達成しました。しかし、これを行うにはもっと良い方法があると確信しています。注:make install危険であり、サポートされていません

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/gtest/libgtest_main.so googlemock/gtest/libgtest.so /usr/lib/

4.リンカーのキャッシュを更新します

...そしてGNUリンカーがライブラリを知っているかどうかを確認します

sudo ldconfig -v | grep gtest

出力が次のようになっている場合:

libgtest.so.0 -> libgtest.so.0.0.0
libgtest_main.so.0 -> libgtest_main.so.0.0.0

その後、すべてが大丈夫です。

これで、gTestframeworkを使用する準備が整いました。-lgtestリンカーフラグとして設定することにより、プロジェクトをライブラリにリンクすることを忘れないでください。オプションで、独自のテストメインルーチンを作成しなかった場合は、明示的な-lgtest_mainフラグを。

ここからは、Googleのドキュメント、およびフレームワークに関する古いドキュメントにアクセスして、フレームワークがどのように機能するかを確認することをお勧めします。ハッピーコーディング!

編集: これはOS Xでも機能します!「OSXでgoogleTestを正しく設定する方法」を参照してください


2
make installライブラリとヘッダーを手動でコピーする代わりに使用できるターゲットはありませんか?
ショーンチン

13
makefileの出力の'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
引用

1.8.0バージョンでファイルの名前が変更されましたか?include/gtest私の知る限りではありません。
Nubcake 2018年

2
あなたの投稿は古くなっています。人々を誤解させないでください、sudo cp -a libgtest_main.so libgtest.so /usr/lib/もう働きません。そもそもファイルはそこにもありません。
Schütze

また、debianがプリインストールされた共有ライブラリを削除した理由も知りたいです(アップストリームの推奨事項に従って削除しましたbugs.debian.org/cgi-bin/bugreport.cgi?bug = 802587)。そこに与えられたwikiリンクはもう存在しません。では、なぜこれが当てはまるのでしょうか。
カルロウッド

33

特にubuntuユーザーのためにこれに答えさせてください。まず、gtest開発パッケージをインストールすることから始めます。

sudo apt-get install libgtest-dev

このパッケージはソースファイルのみをインストールすることに注意してください。必要なライブラリファイルを作成するには、コードを自分でコンパイルする必要があります。これらのソースファイルは/ usr / src / gtestにあります。このフォルダーを参照し、cmakeを使用してライブラリをコンパイルします。

sudo apt-get install cmake # install cmake
cd /usr/src/gtest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo make install

ここで、gtestを使用するプログラムをコンパイルするには、次のものとリンクする必要があります。

-lgtest -lgtest_main -lpthread

これは、Ubuntu14.04LTSで完全に機能しました。


1
実際には、ライブラリを手動でコピーする必要はありません。Makefileにそのターゲットがあります。sudo apt-get install cmake#install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo makeinstallビルドしてコピーする必要があります/ usr / local / lib /
Alexander Zinovyev

1
@AlexanderZinovyev「make:***ターゲットを「インストール」するルールはありません。停止してください。」「
sudomakeinstall

2
「sudomakeinstall」は、Ubuntu 18.04では機能しましたが、Ubuntu16.04では機能しませんでした。
Ahmed Nassar

1
@AhmedNassar:「sudomake install」は、「sudo cp * .a / usr / lib」とまったく同じことを行います。したがって、生成されたMakefileでインストールオプションが使用できない場合は、手動でコピーするだけです
amritkrs 2018

手動sudo cp *.a /usr/libで交換する必要はありませんsudo make install。交換するだけで問題ありません。
lingjiankong

26

通常の「makeinstall」が削除され、cmakeを使用していないため、これを理解するのに少し時間がかかりました。これが私の経験です。職場では、Linuxにrootアクセス権がないため、ホームディレクトリの下にGoogleテストフレームワークをインストールしました。~/usr/gtest/

パッケージを共有ライブラリとして〜/ usr / gtest /にインストールするには、サンプルビルドも一緒に使用します。

$ mkdir ~/temp
$ cd ~/temp
$ unzip gtest-1.7.0.zip 
$ cd gtest-1.7.0
$ mkdir mybuild
$ cd mybuild
$ cmake -DBUILD_SHARED_LIBS=ON -Dgtest_build_samples=ON -G"Unix Makefiles" ..
$ make
$ cp -r ../include/gtest ~/usr/gtest/include/
$ cp lib*.so ~/usr/gtest/lib

インストールを検証するには、簡単なテスト例として次のtest.cを使用します。

    #include <gtest/gtest.h>
    TEST(MathTest, TwoPlusTwoEqualsFour) {
        EXPECT_EQ(2 + 2, 4);
    }

    int main(int argc, char **argv) {
        ::testing::InitGoogleTest( &argc, argv );
        return RUN_ALL_TESTS();
    }

コンパイルします:

    $ export GTEST_HOME=~/usr/gtest
    $ export LD_LIBRARY_PATH=$GTEST_HOME/lib:$LD_LIBRARY_PATH
    $ g++ -I $GTEST_HOME/include -L $GTEST_HOME/lib -lgtest -lgtest_main -lpthread test.cpp 

1
最後の行でエラーが発生します:/ usr / bin / ld:/tmp/cczG727X.o:シンボル '_ZN7testing4TestC2Ev'への未定義の参照。ライブラリの前にtest.cppを配置することを修正しました。すなわち:g ++ test.cpp -I $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932 2015年

gtest_main(lgtest_main)に対してリンクする場合main、テストファイルで独自に定義する必要はありません。
ジーノメンピン

10

CMakeを使用しExternalProject_Addている場合は、ここで説明されているように使用できます。

これにより、gtestのソースコードをリポジトリに保存したり、どこにでもインストールしたりする必要がなくなります。ダウンロードされ、ビルドツリーに自動的に組み込まれます。


2

Debian / Ubuntuのアップデート

Google Mock(パッケージ:)google-mockとGoogle Test(パッケージ:)libgtest-devが統合されました。新しいパッケージはと呼ばれgoogletestます。両方の古い名前は下位互換性のために引き続き使用可能であり、現在は新しいパッケージに依存していますgoogletest

したがって、パッケージリポジトリからライブラリを取得するには、次のようにします。

sudo apt-get install googletest -y
cd /usr/src/googletest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo cp googlemock/*.a googlemock/gtest/*.a /usr/lib

その後、に対して-lgmock(または-lgmock_mainカスタムmainメソッドを使用しない場合はに対して)リンクすることができます。-lpthread。少なくとも私の場合、これはGoogleTestを使用するのに十分でした。

Google Testの最新バージョンが必要な場合は、githubからダウンロードしてください。その後の手順は似ています。

git clone https://github.com/google/googletest
cd googletest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo cp lib/*.a /usr/lib

ご覧のとおり、ライブラリが作成されるパスが変更されています。新しいパスは、パッケージリポジトリでもまもなく有効になる可能性があることに注意してください。

ライブラリを手動でコピーする代わりに、を使用できますsudo make install。「現在」は機能しますが、過去に常に機能するとは限らないことに注意してください。また、このコマンドを使用する場合、ターゲットの場所を制御することはできず、汚染したくない場合があります/usr/lib


1

私も同様にこの状況に圧倒され、このために独自のUbuntuソースパッケージを作成することになりました。これらのソースパッケージを使用すると、バイナリパッケージを簡単に作成できます。これらは、この投稿の時点での最新のgtestおよびgmockソースに基づいています。

Google TestDEBソースパッケージ

GoogleモックDEBソースパッケージ

バイナリパッケージをビルドするには、次のようにします。

tar -xzvf gtest-1.7.0.tar.gz
cd gtest-1.7.0
dpkg-source -x gtest_1.7.0-1.dsc
cd gtest-1.7.0
dpkg-buildpackage

いくつかの前提条件のパッケージが必要であると表示される場合があります。その場合は、apt-getでインストールする必要があります。それとは別に、ビルドされた.debバイナリパッケージは親ディレクトリに配置されている必要があります。

GMockの場合、プロセスは同じです。

ちなみに、私のソースパッケージに固有ではありませんが、gtestをユニットテストにリンクするときは、gtestが最初に含まれていることを確認してくださいhttps://bbs.archlinux.org/viewtopic.php?id=156639)これは一般的な落とし穴。


コンパイルしようとすると、パッケージでエラーが発生します。理由は?これが私のログtest.cpp :(。text + 0x57):testing::Message::Message()' test.cpp:(.text+0x84): undefined reference to testing :: internal :: AssertHelper :: AssertHelper(testing :: TestPartResult :: Type、char const *、int、char const *) 'テストへの未定義の参照です。 cpp :(。text + 0x97): `testing :: internal :: AssertHelper :: operator =(testing :: Message const&)const 'への未定義の参照...長すぎて全部を投稿できません。これを新しいUbuntu14.04 VMで行ったので、必要な依存関係以外は何もインストールされませんでした。
ddelnano 2015年

@ddelnanoええ私もこの小さなグーグルテストの宝石に出くわしました。どうやら共有ライブラリの順序が重要です。gtestを単体テストにリンクするときは、他のライブラリの前にgtestを含めてみてください。私がこの問題にぶつかったとき、このリンクは私のためにそれを解決しました:bbs.archlinux.org/viewtopic.php?id
Nick Weedon

@ddelnano、テストスイートに「main」が定義されていない場合も、「gtest_main」に対してリンクすることを忘れないでください。
Nick Weedon 2015年

他のライブラリは含めませんでした。これが私のファイルにあったすべてです #include <gtest/gtest.h> TEST(MathTest, TwoPlusTwoEqualsFour) { EXPECT_EQ(2 + 2, 4); } int main(int argc, char **argv) { ::testing::InitGoogleTest( &argc, argv ); return RUN_ALL_TESTS(); }
ddelnano 2015年

コメントを投稿するまでブログ投稿を読んでいないことを気にしないでください。いよいよ動作します!
ddelnano 2015年

1

他の誰かが昨日(2016-06-22)のように同じ状況に陥り、すでに投稿されたアプローチで成功しなかった場合に備えLubuntu 14.04て、次の一連のコマンドを使用して機能しました。

git clone https://github.com/google/googletest
cd googletest
cmake -DBUILD_SHARED_LIBS=ON .
make
cd googlemock
sudo cp ./libgmock_main.so ./gtest/libgtest.so gtest/libgtest_main.so ./libgmock.so /usr/lib/
sudo ldconfig

1

askubuntuからのこの答えは私のために働いたものです。パッケージlibgtest-devを使用してソースを取得し、そこからビルドするため、他のオプションよりも単純でエラーが発生しにくいようです。 https //askubuntu.com/questions/145887/why-no-library-files-installed-for-google- test?answertab = votes#tab-top

その回答を参照してください。ただし、ショートカットとして、ここにも手順を示します。

sudo apt-get install -y libgtest-dev
sudo apt-get install -y cmake
cd /usr/src/gtest
sudo cmake .
sudo make
sudo mv libg* /usr/lib/

その後、gtest問題なく依存するプロジェクトを構築することができました。


1

次の方法では/usr/libCMakeLists.txtファイルを最小限に変更するだけで、ディレクトリを手動で操作する必要がなくなります。また、パッケージマネージャーをクリーンにアンインストールすることもできますlibgtest-dev

アイデアは、あなたがlibgtest-dev経由してパッケージを取得するときです

sudo apt install libgtest-dev

ソースは場所に保存されます /usr/src/googletest

CMakeLists.txt必要な依存関係を見つけることができるように、そのディレクトリをポイントするだけです。

単純に置き換えるFindGTestadd_subdirectory(/usr/src/googletest gtest)

最後に、それはこのように見えるはずです

add_subdirectory(/usr/src/googletest gtest)
target_link_libraries(your_executable gtest)

0

これにより、Ubuntu / DebianベースのシステムにGoogleテストとモックライブラリがインストールされます。

sudo apt-get install google-mock

debianベースの画像でグーグルクラウドでテストされています。


うーん、いや、これはインストールするだけだと思いますがgooglemock、インストールしませんgoogletest(gtest)。少なくともそれが私に起こったことです。
jotadepicas 2016

0

これにより、gtestとgmock1.7.0の両方がビルドおよびインストールされます。

mkdir /tmp/googleTestMock
tar -xvf googletest-release-1.7.0.tar.gz -C /tmp/googleTestMock
tar -xvf googlemock-release-1.7.0.tar.gz -C /tmp/googleTestMock
cd /tmp/googleTestMock
mv googletest-release-1.7.0 gtest
cd googlemock-release-1.7.0
cmake -DBUILD_SHARED_LIBS=ON .
make -j$(nproc)
sudo cp -a include/gmock /usr/include
sudo cp -a libgmock.so libgmock_main.so /usr/lib/
sudo cp -a ../gtest/include/gtest /usr/include
sudo cp -a gtest/libgtest.so gtest/libgtest_main.so /usr/lib/
sudo ldconfig

-1

@ ManuelSchneid3rの回答に基づく1.8.1の場合、私は次のことをしなければなりませんでした。

wget github.com/google/googletar xf release-1.8.1.tar.gz 
tar xf release-1.8.1.tar.gz
cd googletest-release-1.8.1/
cmake -DBUILD_SHARED_LIBS=ON .
make

次にmake install、1.8.1で機能するように見えましたが、@ ManuelSchneid3rに続いて次のことを意味します。

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/include/gmock /usr/include
sudo cp `find .|grep .so$` /usr/lib/

私がこの答えを書いたのは久しぶりです。価値がない/無効だと思われる場合は、何が問題なのか教えてください。
NTG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.