![](/img/trans.png)
[英]how do i compile/link test cases (googleTest) using cmake to the code bundled up in shared library?
[英]How to set up googleTest as a shared library on Linux
Debian 不再為 gTest 提供任何預編譯包。 他們建議您將框架集成到項目的 makefile 中。但我想保持我的 makefile 干凈。 如何像以前的版本(<1.6.0)一樣設置 gTest,以便我可以鏈接到庫?
在開始之前,請確保您已閱讀並理解Google 的這篇筆記! 本教程使 gtest 的使用變得簡單,但可能會引入令人討厭的錯誤。
wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz
或者手動獲取。 我不會維護這個小操作方法,所以如果你偶然發現它並且鏈接已經過時,請隨時編輯它。
tar xf release-1.8.0.tar.gz
cd googletest-release-1.8.0
cmake -DBUILD_SHARED_LIBS=ON .
make
此步驟可能因發行版而異,因此請確保將標頭和庫復制到正確的目錄中。 我通過檢查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/
...並檢查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! 請參閱“如何在 OS X 上正確設置 googleTest”
讓我專門為 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
這在 Ubuntu 14.04LTS 上非常適合我。
我花了一段時間才弄清楚這一點,因為正常的“make install”已被刪除,而且我不使用 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
如果你碰巧使用CMake的,你可以使用ExternalProject_Add
描述這里。
這避免了您必須將 gtest 源代碼保存在您的存儲庫中,或將其安裝在任何地方。 它會自動下載並構建在您的構建樹中。
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
。 至少在我的情況下,這足以使用 Google Test。
如果您想要最新版本的 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
。
我同樣對這種情況感到不知所措,最終為此制作了自己的 Ubuntu 源代碼包。 這些源包允許您輕松生成二進制包。 它們基於本文中最新的 gtest 和 gmock 源。
要構建二進制包,請執行以下操作:
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 ) 這似乎是一個常見問題。
以防萬一其他人昨天(2016 年 6 月 22 日)遇到和我一樣的情況,並且使用已經發布的方法也沒有成功 - 在Lubuntu 14.04
它使用以下命令鏈對我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
來自 askubuntu 的這個答案對我有用。 似乎比其他選項更簡單,更不容易出錯,因為它使用包libgtest-dev
從那里獲取源和構建: https : libgtest-dev
-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
構建依賴於gtest
項目。
以下方法避免了手動弄亂/usr/lib
目錄,同時還需要對CMakeLists.txt
文件進行最少的更改。 它還可以讓您的包管理器干凈地卸載libgtest-dev
。
這個想法是,當你得到libgtest-dev
通過包
sudo apt install libgtest-dev
源存儲在位置/usr/src/googletest
您可以簡單地將CMakeLists.txt
指向該目錄,以便它可以找到必要的依賴項
只需更換FindGTest
與add_subdirectory(/usr/src/googletest gtest)
最后,它應該是這樣的
add_subdirectory(/usr/src/googletest gtest)
target_link_libraries(your_executable gtest)
這將在基於 Ubuntu/Debian 的系統中安裝 google 測試和模擬庫:
sudo apt-get install google-mock
在基於 debian 的圖像中在谷歌雲中測試。
這將構建並安裝 gtest 和 gmock 1.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
使用buster
和bullseye
可以安裝以下三個包而無需編譯任何東西:
sudo apt-get install libgtest-dev libgmock-dev googletest
這包括 gmock。
對於基於@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/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.