2011-11-02 56 views
9

我在Windows上使用CMake來構建基於Boost.Test的測試套件。當我動態鏈接到Boost.Test時,我的可執行文件需要能夠找到DLL(位於../../../boost/boost_1_47/lib或類似於可執行文件的東西)。如何使用CMake構建的可執行文件訪問Boost DLL?

因此,我需要將DLL複製到可執行文件所在的文件夾中,或者以其他方式找到它。用CMake實現這個最好的方法是什麼?

- 其他信息 -

我的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

我結束了使用install命令拷貝過來的升壓DLL到可執行文件的文件夾:

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目標在Visual Studio中運行測試:

  1. 我總是將.../boost/boost_1_47/lib添加到我的命令PATH環境變量中,因此可以在運行時找到boost unit_test_framework dll。這就是我的建議。

  2. 如果出於某種原因改變PATH是不可能的,你可以用cmake複製這些文件。

(未經測試)

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命令,如Hans Passant建議。在您的代碼片段中,您沒有可執行文件的INSTALL命令;所以即使你的可執行文件不會在「可執行文件夾」中結束。首先添加一個cmake INSTALL命令,將您的可執行文件放在某個地方以響應cmake INSTALL目標。一旦你有了這個工作,我們可以研究如何添加另一個INSTALL命令來將boost unit_test_framework庫放到同一個位置。之後,如果您想使用CPACK創建安裝程序,則該庫將自動與可執行文件一起安裝。

2

我有一個非常類似的問題,但在這裏提出的解決方案是不是真的滿意。 像原始海報一樣,我想運行基於boost :: test的單元測試。

我有多個測試項目,其中一個針對我們產品的每個市長組件。 必須在每次測試之前運行安裝目標意味着重新編譯整個事情只是爲了運行屬於核心組件的測試。這就是我想要避免的。

如果我改變核心組件中的某些東西,我想編譯該核心組件和相關的測試。然後運行測試。當測試成功時,我纔想編譯並最終安裝其餘部分。

對於在調試器中運行測試,我發現了一些非常有用的CMake的腳本: https://github.com/rpavlik/cmake-modules

有了這個,我可以指定所需的dll的所有目錄和PATH環境變量設置爲

# 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其中包含從升壓的DLL和所有其他圖書館可以找到的目錄,新工藝。

現在我正在尋找我怎麼能實現與ADD_CUSTOM_COMMAND類似的()的東西

更新:

ADD_CUSTOM_COMMAND()可以有cmake的寫入到一個批處理文件中的多個命令。因此,您可以首先設置所有運行時目錄的路徑,然後執行測試可執行文件。爲了能夠方便地手動執行測試,我讓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() 

有了這個很多第一。

相關問題