Son zamanlarda C ++ projelerimi derlemek için CMake kullanmaya başladım ve şimdi kodum için bazı birim testleri yazmaya başlamak istiyorum. Bu konuda yardımcı olması için Google Test yardımcı programını kullanmaya karar verdim, ancak başlamak için biraz yardıma ihtiyacım var.
Tüm gün boyunca çeşitli kılavuzları ve örnekleri okudum Primer , IBM'de bir giriş ve SO ile ilgili bazı sorular ( burada ve burada ) ve izini kaybettiğim diğer kaynaklar. Orada çok şey olduğunun farkındayım ama bir şekilde hala zorluklar yaşıyorum.
Şu anda gtest'i doğru derlediğimi / kurduğumu ve çalışmadığını doğrulamak için en temel testi uygulamaya çalışıyorum. Tek kaynak dosya (testgtest.cpp) neredeyse tam olarak bu önceki cevaptan alınmıştır:
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
ve ilişkili CMakeLists.txt dosyam aşağıdaki gibidir:
cmake_minimum_required(VERSION 2.6)
project(basic_test)
# Setup testing
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIR})
# Add test cpp file
add_executable(runUnitTests
testgtest.cpp
)
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})
add_test(
NAME runUnitTests
COMMAND runUnitTests
)
Main'i cpp dosyasının sonunda sağlamak yerine gtest_main'e bağlamayı seçtiğime dikkat edin, çünkü bunun testi birden çok dosyaya daha kolay ölçeklendirmeme izin vereceğine inanıyorum.
Oluşturulan .sln dosyasını oluştururken (Visual C ++ 2010 Express'te) maalesef formda uzun bir hata listesi alıyorum
2>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: virtual __thiscall std::basic_iostream<char,struct std::char_traits<char> >::~basic_iostream<char,struct std::char_traits<char> >(void)" (??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ) already defined in gtestd.lib(gtest-all.obj)
Sanırım gtest kitaplıklarına başarılı bir şekilde bağlanamadığım anlamına geliyor. Hata ayıklama kitaplıklarına bağlanırken, daha sonra hata ayıklama modunda oluşturmaya çalıştığımdan emin oldum.
DÜZENLE
Biraz daha araştırma yaptıktan sonra, benim sorunumun gtest'i inşa ettiğim kütüphane türüyle ilgili olduğunu düşünüyorum. CMake ile gtest oluştururken, BUILD_SHARED_LIBSkontrol edilmemişse ve programımı bu .lib dosyalarına bağlarsam, yukarıda belirtilen hataları alıyorum. Ancak, BUILD_SHARED_LIBSişaretlenirse , bir dizi .lib ve .dll dosyası oluşturuyorum. Şimdi bu .lib dosyalarına bağlanırken program derler, ancak çalıştırıldığında gtest.dll'yi bulamadığından şikayet eder.
A SHAREDve a not SHAREDkitaplığı arasındaki farklar nelerdir ve paylaşılmamayı seçersem neden çalışmaz? CMakeLists.txt'de projem için eksik olduğum bir seçenek var mı?
enable_testing()?
ExternalProject_Addziyadeadd_subdirectory. Ayrıntılar için bu yanıta bakın.