मुझे हाल ही में अपने C ++ प्रोजेक्ट्स को संकलित करने के लिए CMake का उपयोग करने पर बेचा गया है, और अब मैं अपने कोड के लिए कुछ यूनिट टेस्ट लिखना शुरू करना चाहूंगा। मैंने इसकी सहायता के लिए Google परीक्षण उपयोगिता का उपयोग करने का निर्णय लिया है, लेकिन आरंभ करने में कुछ मदद की आवश्यकता है।
पूरे दिन मैं विभिन्न गाइडों और उदाहरणों को पढ़ रहा हूं , इसमें प्राइमर , आईबीएम पर एक परिचय और एसओ ( यहां और यहां कुछ प्रश्न) शामिल हैं ) साथ ही साथ अन्य स्रोत भी शामिल हैं जिनका मैंने ट्रैक किया है। मुझे लगता है कि वहाँ बहुत कुछ है, लेकिन किसी तरह मुझे अभी भी मुश्किलें हो रही हैं।
मैं वर्तमान में सबसे बुनियादी परीक्षण को लागू करने की कोशिश कर रहा हूं, यह पुष्टि करने के लिए कि मैंने सही तरीके से संकलित / स्थापित किया है और यह काम नहीं कर रहा है। एकमात्र स्रोत फ़ाइल (testgtest.cpp) को इस पिछले उत्तर से लगभग बिल्कुल लिया गया है :
#include <iostream>
#include "gtest/gtest.h"
TEST(sample_test_case, sample_test)
{
EXPECT_EQ(1, 1);
}
और मेरे संबद्ध CMakeLists.txt इस प्रकार है:
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
)
ध्यान दें कि मैंने cpp फ़ाइल के अंत में मुख्य प्रदान करने के बजाय gtest_main के खिलाफ लिंक करना चुना है क्योंकि मेरा मानना है कि यह मुझे कई फ़ाइलों तक अधिक आसानी से परीक्षण करने की अनुमति देगा।
जब निर्मित .sln फ़ाइल (दृश्य C ++ 2010 एक्सप्रेस में) का निर्माण करते हैं, तो मुझे दुर्भाग्य से फॉर्म की त्रुटियों की एक लंबी सूची मिलती है
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)
जो मुझे लगता है कि इसका मतलब है कि मैं सफलतापूर्वक gtest पुस्तकालयों से लिंक नहीं कर रहा हूं। मैंने यह सुनिश्चित किया है कि डिबग लाइब्रेरी के खिलाफ लिंक करते समय, मैंने तब डिबग मोड में निर्माण करने की कोशिश की है।
संपादित करें
कुछ और खुदाई करने के बाद, मुझे लगता है कि मेरा मुद्दा पुस्तकालय के प्रकार के साथ कुछ करना है जो मैं gtest में बना रहा हूं। सीएमके के साथ गाइस्ट का निर्माण करते समय, यदि BUILD_SHARED_LIBS
संयुक्त राष्ट्र की जाँच की जाती है, और मैं अपने प्रोग्राम को इन .lib फ़ाइलों के खिलाफ लिंक करता हूं , तो मुझे ऊपर उल्लिखित त्रुटियां मिलती हैं। हालांकि, यदिBUILD_SHARED_LIBS
जाँच की जाती है तो मैं .lib और .dll फ़ाइलों का एक सेट तैयार करता हूँ। जब अब इन .lib के विरुद्ध लिंक करने से प्रोग्राम कंपाइल होता है, लेकिन जब रन शिकायत करता है कि वह gtest.dll नहीं पा सकता है।
एक SHARED
और नहीं SHARED
पुस्तकालय के बीच अंतर क्या हैं , और अगर मैं साझा नहीं चुनते हैं, तो यह काम क्यों नहीं करता है? क्या मेरी परियोजना के लिए CMakeLists.txt में कोई विकल्प है जो मुझे याद आ रही है?
enable_testing()
है?
ExternalProject_Add
बजाय का उपयोग करके आप अपने आप में GTest स्रोतों को शामिल करने से बच सकते हैंadd_subdirectory
। देखें इस उत्तर जानकारी के लिए।