在去年初玩了一下 Google Test,雖然我還蠻喜歡他的簡潔性,不過仍然繼續用 Boost.Test,一來是因為在我使用的電腦 Boost 可得性比較高,二來是因為當時只能在 Visual C++ 下面使用,用 MinGW 編譯有點問題。

虧我個人的 MSYS 和 MinGW 工具裝得相當齊全,但是執行 configure、make 卻不太成功,我也沒有閒功夫去追原因為何。

現在發現 1.5 版出現了實驗性的 CMakeLists,我比較熟悉 cmake,遇到問題也比較清楚該如何下手。

一開始我用 MSYS Makefiles 和 MinGW Makefiles 都編不起來,正納悶著,接著發現錯誤訊息幾乎都是和 thread 有關。掃描了一下出錯的程式碼和 CMakeLists,我得出了結論:問題竟然出在我的環境安裝得太完整了,因為我有裝 pthread。

看起來似乎是 Google Test 對 pthread 判斷不夠精確,雖然在 CMake 或者更早的 configure 都正確判斷出我有 pthread,也定義了相關的 compile flag,但是在程式碼中仍然沒有正確的使用 pthread。

我也懶得去修他們的源碼,這裡提供一個 CMakeLists 的 work around,同時裝 MinGW 和 pthread 才需要修改,不然直接執行 cmake 即可。開啟 CMakeLists.txt,找到這一行

find_package(Threads)

把這行註解掉,改成

# find_package(Threads)
set(CMAKE_USE_PTHREADS_INIT false)
set(CMAKE_THREAD_LIBS_INIT false)

然後執行 cmake

cmake -G "MSYS Makefiles" ../gtest-1.5.0
make

接下來會吐出一大堆令人不安的 warning,不過最後竟然成功的吐出 libgtest.a、libgtest_main.a 和 gtest_unittest.exe。

看起來似乎是 google test 的執行緒模型以 pthread 為準,缺乏 pthread 會使 google test 無法顧及 thread safty,不過一般執行倒沒甚麼問題。未來版本應該會改進這部分的判斷。

 

novus 發表在 痞客邦 PIXNET 留言(0) 人氣()