在去年初玩了一下 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,不過一般執行倒沒甚麼問題。未來版本應該會改進這部分的判斷。
留言列表