2011-11-02 8 views
9

मैं Boost.Test पर आधारित परीक्षण सूट बनाने के लिए विंडोज पर सीएमके का उपयोग कर रहा हूं। जैसा कि मैं बूस्ट से जोड़ रहा हूं। गतिशील रूप से, मेरे निष्पादन योग्य को DLL (जो ../../../boost/boost_1_47/lib या निष्पादन योग्य के सापेक्ष कुछ ऐसा) खोजने में सक्षम होना चाहिए।सीओके के साथ बनाए गए निष्पादन योग्य को बूस्ट डीएलएल कैसे पहुंचाया जा सकता है?

तो मुझे या तो डीएलएल को उस फ़ोल्डर में कॉपी करने की आवश्यकता है जहां निष्पादन योग्य है, या इसे किसी अन्य तरीके से खोजने योग्य बनाना है। सीएमके के साथ इसे हासिल करने का सबसे अच्छा तरीका क्या है?

- अतिरिक्त जानकारी -

मेरे CMakeLists.txt इस बूस्ट इस समय विन्यास से संबंधित है:

set(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
set(BOOST_ROOT "../boost") 

find_package(Boost 1.47 COMPONENTS unit_test_framework REQUIRED) 
include_directories(${Boost_INCLUDE_DIR}) 
link_directories(${Boost_LIBRARY_DIR}) 

add_executable(test-suite test-suite.cpp) 
target_link_libraries(test-suite ${Boost_LIBRARIES}) 
+2

http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:install –

उत्तर

4

मैं निष्पादन के फ़ोल्डर में बूस्ट DLL पर कॉपी करने install आदेश का उपयोग कर समाप्त हो गया:

get_filename_component(UTF_BASE_NAME ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_RELEASE} NAME_WE) 
get_filename_component(UTF_PATH ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_RELEASE} PATH) 
install(FILES ${UTF_PATH}/${UTF_BASE_NAME}.dll 
    DESTINATION ../bin 
    CONFIGURATIONS Release RelWithDebInfo 
) 

get_filename_component(UTF_BASE_NAME_DEBUG ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_DEBUG} NAME_WE) 
install(FILES ${UTF_PATH}/${UTF_BASE_NAME_DEBUG}.dll 
    DESTINATION ../bin 
    CONFIGURATIONS Debug 
) 
6

मान लिया जाये कि आप दृश्य स्टूडियो में RUN_TESTS लक्ष्य बना कर अपने परीक्षण चल रहे हैं:

  1. मैं हमेशा जोड़ने .../बढ़ावा/boost_1_47/lib मेरे आदेश पथ वातावरण चर को बढ़ावा unit_test_framework DLLs रन टाइम पर पाया जा सकता है तो। मैं यही सलाह देता हूं।

  2. यदि आपके पैथ को बदलने के किसी कारण से संभव नहीं है, तो आप फ़ाइलों को सेमेक से कॉपी कर सकते हैं।

(untested)

get_filename_component(LIBNAME "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_RELEASE}" NAME) 
add_custom_command(TARGET test-suite POST_BUILD 
    COMMAND ${CMAKE_COMMAND} -E copy "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_RELEASE}" "${CMAKE_CURRENT_BINARY_DIR}/${LIBNAME}" 
) 

3. यदि आप हैं नहीं केवल तरह का निर्माण समय में परीक्षण चल रहा है (जैसा कि मैंने ऊपर मानते हुए किया गया था), तो आप INSTALL आदेशों की एक श्रृंखला की जरूरत है, हंस पासेंट ने सुझाव दिया। आपके स्निपेट में आपके पास आपके निष्पादन योग्य के लिए INSTALL कमांड नहीं है; इसलिए आपका निष्पादन योग्य "निष्पादन योग्य फ़ोल्डर में" समाप्त नहीं होगा। सबसे पहले cmake स्थापित करने के जवाब में अपने निष्पादन योग्य जगह को रखने के लिए एक cmake INSTALL कमांड जोड़ें। एक बार जब आप काम कर लेंगे, तो हम बूस्ट इकाई_स्टेस्ट_फ्रेमवर्क लाइब्रेरी को उसी स्थान पर रखने के लिए एक और इंस्टाल कमांड जोड़ने का तरीका जानने के लिए काम कर सकते हैं। उसके बाद, यदि आप सीपीएक्स का उपयोग कर इंस्टॉलर बनाना चाहते हैं, तो पुस्तकालय स्वचालित रूप से निष्पादन योग्य के साथ स्थापित हो जाएगा।

2

मैं एक बहुत ही इसी तरह की समस्या है, लेकिन यहां प्रस्तुत समाधान वास्तव में संतोषजनक नहीं है। मूल पोस्टर की तरह, मैं boost :: test के आधार पर यूनिट परीक्षण चलाने के लिए चाहता हूं।

मेरे पास हमारे उत्पाद के प्रत्येक मेयर घटक के लिए एक से अधिक परीक्षण परियोजनाएं हैं। प्रत्येक परीक्षण से पहले इंस्टॉल लक्ष्य को चलाने के लिए मुख्य घटक से संबंधित परीक्षण चलाने के लिए पूरी चीज को फिर से सम्मिलित करना है। यही वह है जिसे मैं टालना चाहता हूं।

यदि मैं मूल घटक में कुछ बदलता हूं, तो मैं उस मूल घटक और संबंधित परीक्षणों को संकलित करना चाहता हूं। और फिर परीक्षण चलाएं। जब परीक्षण सफल होते हैं, तो तभी मैं संकलित करना चाहता हूं और अंततः इसे बाकी स्थापित करना चाहता हूं। https://github.com/rpavlik/cmake-modules

इस के साथ

, मैं आवश्यक DLLs के सभी निर्देशिकाओं को निर्दिष्ट कर सकते हैं और पथ वातावरण चर के लिए निर्धारित है:

डीबगर में परीक्षण चलाने के लिए, मैं कुछ बहुत ही उपयोगी cmake स्क्रिप्ट नहीं मिली नई प्रक्रिया:

# for debugging 
INCLUDE(CreateLaunchers) 

create_target_launcher(PLCoreTests 
    ARGS "--run-test=Core1" 
    RUNTIME_LIBRARY_DIRS ${PL_RUNTIME_DIRS_DEBUG} ${PROJECT_BINARY_DIR}/bin/Debug 
    WORKING_DIRECTORY ${PL_MAIN_DIR}/App/PL/bin 
) 

कहाँ $ {PL_RUNTIME_DIRS_DEBUG} निर्देशिका जहां बढ़ावा से DLLs और अन्य सभी पुस्तकालयों पाया जा सकता है शामिल हैं।

अब मैं मैं ADD_CUSTOM_COMMAND साथ कुछ इसी तरह() कैसे प्राप्त कर सकते हैं के लिए देख रहा हूँ

अद्यतन:

ADD_CUSTOM_COMMAND() कई आदेशों cmake एक बैच फ़ाइल में लिखते हैं हो सकता है। तो, आप पहले सभी रनटाइम निर्देशिकाओं के साथ पथ सेट कर सकते हैं, और उसके बाद परीक्षण निष्पादन योग्य निष्पादित कर सकते हैं।

MACRO(RunUnitTest TestTargetName) 
    IF(RUN_UNIT_TESTS) 
     SET(TEMP_RUNTIME_DIR ${PROJECT_BINARY_DIR}/bin/Debug) 
     FOREACH(TmpRuntimeDir ${PL_RUNTIME_DIRS_DEBUG}) 
      SET(TEMP_RUNTIME_DIR ${TEMP_RUNTIME_DIR} ${TmpRuntimeDir}) 
     ENDFOREACH(TmpRuntimeDir) 

     ADD_CUSTOM_COMMAND(TARGET ${TestTargetName} POST_BUILD 
      COMMAND echo "PATH=${TEMP_RUNTIME_DIR};%PATH%" > ${TestTargetName}_script.bat 
      COMMAND echo ${TestTargetName}.exe --result_code=no --report_level=no >> ${TestTargetName}_script.bat 
      COMMAND ${TestTargetName}_script.bat 
      WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug 
     ) 
    ENDIF(RUN_UNIT_TESTS) 
ENDMACRO() 
इस के साथ

, इकाई परीक्षण, त्रुटियों को पकड़ने जितनी जल्दी हो सके पूरे संकलित करने के लिए बिना: आसानी से परीक्षण मैन्युअल रूप से निष्पादित करने में सक्षम होने के लिए, मैं cmake निर्माण निर्देशिका में एक अतिरिक्त बैच फ़ाइल बना सकते हैं बहुत पहले

संबंधित मुद्दे

 संबंधित मुद्दे