2012-09-22 17 views
8

मैं के रूप में मूल रूप में संभव CMake साथ GTest एकीकृत करने के लिए कोशिश कर रहा हूँ। लेकिन मेरी टेस्ट प्रोजेक्ट्स के लिए डिफ़ॉल्ट बिल्ड प्रकार /MDd और GTest डिफ़ॉल्ट /MTd पर डिफ़ॉल्ट है। मैं DLL डीबग उत्सर्जित करने के लिए मैन्युअल रूप से GTest प्रोजेक्ट गुणों को बदल रहा हूं।सीएमके का उपयोग करके, डिफ़ॉल्ट रूप से जीटीएस्ट बिल्ड/एमडीडी (बजाय/एमटीडी के बजाय) कैसे बनाया जाए?

लेकिन हर बार जब मैं अपने CMakeLists.txt में परिवर्तन करता हूं, तो GTest /MTd पर वापस आ जाता है। मैं इसे कैसे रोकूं?

उत्तर

0

हम GTest के स्वयं के निर्माण प्रणाली को दरकिनार और एक CMake object library अपनी एकता का निर्माण स्रोत फ़ाइल gtest-all.cc से के रूप में GTest संकलन के द्वारा समस्या का समाधान:

# compile Google Test as an object library 
add_library(gtest OBJECT "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.6.0/src/gtest-all.cc") 
set_property(TARGET gtest PROPERTY INCLUDE_DIRECTORIES 
    "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.6.0" 
    "${CMAKE_CURRENT_SOURCE_DIR}/gtest-1.6.0/include") 

इस तरह GTest हमेशा एक ही विकल्प है कि हम के लिए उपयोग के साथ संकलित किया जाएगा परियोजना। एक परीक्षण निष्पादन GTest का उपयोग करता है तो निम्नलिखित तरीके से बनाया जा सकता है:

add_executable(test_executable ${TESTS_SRC} $<TARGET_OBJECTS:gtest>) 
add_test(NAME test COMMAND test_executable) 
+0

linux पर के लिए काम किया, GTest 'pthreads' पुस्तकालय पर निर्भर करता है। मैं 'gtest' ऑब्जेक्ट पर ऐसी निर्भरता कैसे जोड़ूं? – Hindol

+0

इसके लिए एक [अलग प्रश्न] बनाया गया है (http://stackoverflow.com/questions/12560054/how-to-set-library- निर्भरता-on-cmake-library-objects) इसके लिए। – Hindol

+0

इस तरह, आप प्रत्येक अलग परीक्षण निष्पादन योग्य के लिए gtest के पूरे स्रोत को पुन: संकलित करते हैं - बहुत कुशल नहीं। आप gtest के स्वयं के CMakeLists.txt में निहित सभी चेक और सेटिंग्स भी खो देते हैं, लिनक्स पर पर्थ्रेड पर लापता निर्भरता होने पर एक प्रतिक्रिया होती है। – Fraser

13

आप इस लक्ष्य को हासिल करने के लिए gtest शामिल करने से पहले ON को gtest_force_shared_crt परिभाषित कर सकते हैं। आप कमांड लाइन के माध्यम से यह कर सकते हैं या तो:

cmake . -Dgtest_force_shared_crt=ON 

या अपने CMakeLists.txt में:

set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) 
+1

आपको नीचे से टेड मिडलटन के सुधार को जोड़ना चाहिए। सेट() लाइन जोड़ना, जैसा कि आप सुझाव देते हैं, gtst build पर कोई प्रभाव नहीं पड़ता है। – Ela782

13

मुझे लगता है कि एक बेहतर विकल्प है @ फ्रेजर का जवाब - यह मामला, cmake + gtest में 'बस काम' ।

यह आदेश आंतरिक gtest option सेटिंग को ओवरराइड करने में उल्लेख है कि लायक है, तो आप cmake कैश में चर रखना होगा:

set(gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll") 
+0

'FORCE' को भी निर्दिष्ट किया जाना चाहिए, https://github.com/google/googletest/blob/master/googletest/README.md देखें। –

4

हैं टेड मिडलटन के जवाब काम नहीं करता है, बल का उपयोग करने का प्रयास करें:

set(gtest_force_shared_crt ON CACHE BOOL "Always use msvcrt.dll" FORCE) 

यह मेरे

+0

यह https://github.com/google/googletest/blob/master/googletest/README.md के अनुसार अनुशंसित तरीका है। –