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_LIBS
kontrol edilmemişse ve programımı bu .lib dosyalarına bağlarsam, yukarıda belirtilen hataları alıyorum. Ancak, BUILD_SHARED_LIBS
iş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 SHARED
ve a not SHARED
kitaplığı 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_Add
ziyadeadd_subdirectory
. Ayrıntılar için bu yanıta bakın.