2011-11-02 19 views
9

Tôi đang sử dụng CMake trên Windows để xây dựng bộ thử nghiệm dựa trên Boost.Test. Khi tôi đang liên kết với Boost.Test động, thực thi của tôi cần để có thể tìm thấy các DLL (mà là theo ../../../boost/boost_1_47/lib hoặc một cái gì đó như thế liên quan đến thực thi).Làm thế nào để tăng cường DLL có thể truy cập vào một tập tin thực thi được xây dựng với CMake?

Vì vậy, tôi cần phải sao chép tệp DLL vào thư mục nơi tệp thực thi hoặc làm cho nó có thể tìm thấy theo một cách khác. Cách tốt nhất để đạt được điều này với CMake là gì?

- bổ sung thông tin -

My CMakeLists.txt có Boost này cấu hình liên quan tại thời điểm này:

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 –

Trả lời

4

tôi đã kết thúc bằng lệnh install để sao chép các DLL Boost trên vào thư mục của thực thi:

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

Giả sử bạn đang chạy thử nghiệm của bạn bằng cách xây dựng các mục tiêu RUN_TESTS trong Visual Studio:

  1. Tôi luôn thêm .../boost/boost_1_47/lib vào biến môi trường PATH lệnh của tôi, vì vậy, các tệp dll đơn vị boost_test_framework có thể tìm thấy tại thời gian chạy. Đó là những gì tôi đề nghị.

  2. Nếu vì một lý do nào đó, việc thay đổi PATH của bạn là không thể, bạn có thể sao chép tệp bằng cmake.

(chưa được kiểm tra)

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. Nếu bạn là KHÔNG chỉ chạy các bài kiểm tra tại thời gian xây dựng (như tôi đã giả định ở trên), sau đó bạn cần một loạt các INSTALL lệnh, như Hans Passant gợi ý. Trong đoạn mã của bạn, bạn không có lệnh INSTALL để thực thi; vì vậy ngay cả tệp thực thi của bạn cũng sẽ không kết thúc "trong thư mục thực thi". Đầu tiên, thêm lệnh cmake INSTALL để đặt một nơi nào đó có thể thực thi của bạn để đáp ứng với mục tiêu CÀI ĐẶT cmake. Một khi bạn đã làm việc đó, chúng ta có thể tìm cách thêm một lệnh INSTALL khác để đặt thư viện boost_trong thư viện unit_test_framework vào cùng một vị trí. Sau đó, nếu bạn muốn tạo một trình cài đặt bằng CPACK, thư viện sẽ tự động được cài đặt với tệp thực thi.

2

Tôi có một vấn đề rất tương tự, nhưng các giải pháp trình bày ở đây là không thực sự thỏa đáng. Giống như poster gốc, tôi muốn chạy thử nghiệm đơn vị dựa trên boost :: test.

Tôi có nhiều dự án thử nghiệm, một dự án cho từng thành phần thị trưởng của sản phẩm của chúng tôi. Có để chạy các mục tiêu cài đặt trước khi mỗi thử nghiệm có nghĩa là biên dịch lại toàn bộ điều chỉ để chạy các bài kiểm tra thuộc về một thành phần cốt lõi. Đó là những gì tôi muốn tránh.

Nếu tôi thay đổi thứ gì đó trong thành phần cốt lõi, tôi muốn biên dịch thành phần cốt lõi đó và các kiểm tra liên quan. Và sau đó chạy thử nghiệm. Khi các thử nghiệm thành công, chỉ sau đó tôi mới muốn biên dịch và cuối cùng cài đặt phần còn lại của nó.

Đối với chạy các bài kiểm tra trong trình gỡ lỗi, tôi tìm thấy một số kịch bản cmake rất hữu ích tại địa chỉ: https://github.com/rpavlik/cmake-modules

Với điều này, tôi có thể chỉ định tất cả các thư mục của file dll cần thiết, và các biến môi trường PATH được thiết lập cho quy trình mới:

# 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 
) 

Trường hợp $ {PL_RUNTIME_DIRS_DEBUG} chứa các thư mục nơi dlls từ tăng và tất cả các thư viện khác có thể được tìm thấy.

Bây giờ tôi đang tìm kiếm làm thế nào tôi có thể đạt được một cái gì đó tương tự với ADD_CUSTOM_COMMAND()

Cập nhật:

ADD_CUSTOM_COMMAND() có thể có nhiều lệnh cmake viết vào một tập tin batch. Vì vậy, trước tiên bạn có thể thiết lập đường dẫn với tất cả các thư mục thời gian chạy, và sau đó thực hiện kiểm tra thực thi. Để có thể dễ dàng thực hiện các bài kiểm tra bằng tay, tôi để cho cmake tạo ra một tập tin thực thi bổ sung trong thư mục build:

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() 

Với điều này, các bài kiểm tra đơn vị bắt lỗi càng sớm càng tốt, mà không cần phải biên dịch toàn bộ rất nhiều.

Các vấn đề liên quan