簡體   English   中英

如何使用CMake最好地處理數據文件?

[英]How to best handle data files with CMake?

我有一個包含代碼和一些數據文件的CMake項目(圖像是精確的)。

我的目錄結構是這樣的:

  • SRC
  • 數據

src包含源代碼,數據包含數據文件。 CMake建議在源代碼構建之外,所以當我調用make時 ,我有可執行程序,但不是數據文件,因此我無法執行該程序。

當然, make install會將我的數據文件復制到所需的位置並使其正常工作,因此我現在就這樣開發:

  1. cmake -DCMAKE_INSTALL_DIR = dist
  2. <edit source code>
  3. make install
  4. DIST / myprogram.exe

如果我正在使用命令行和編輯器,那沒關系,但我最近決定轉向Eclipse CDT。 從CMake生成Eclipse項目效果很好,但是從Eclipse手動執行安裝目標並不是那么好。

你們是如何解決這個問題的呢? 你的程序是否有一些聰明的算法來嘗試找到它的數據目錄,即使它不是二進制文件的位置? 或者你不使用源代碼構建?

configure_file應該解決這個問題。

我的數據目錄中有一個CMakeLists.txt文件,其中包含以下內容:

configure_file(data_file ${CMAKE_CURRENT_BINARY_DIR}/data_file COPYONLY)

這會在調用cmake時將指定的文件復制到構建目錄中,因此即使在源代碼構建之外,它也可以在同一位置使用。

configure_file不支持目錄,但file命令執行:

file(COPY assets DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

如果復制文件需要花費太多時間(它們是圖像......),您可以通過使用configure_file創建“自定義”data_header.h來實現更好的目的,該configure_file包含仍在源目錄中的數據的路徑。

這就是我所做的:我的源代碼中有一個文件“global_build_config.h.in”,包含以下內容:

const char* const global_testdatapath = "@Test_Data_Path@";

然后在CMake中使用configure_file:

# Assume CMake knows a variable Test_Data_Path, it will be filled in automatically
# in the generated config/Global_Build_Config.h
configure_file( Global_Build_Config.h.in ${CMAKE_BINARY_DIR}/config/Global_Build_Config.h )
# The config directory should be added as a include-searchpath
include_directories( ${CMAKE_BINARY_DIR}/config/ )

然后我可以在我的cpp文件中#include“Global_Build_Config.h”並引用固定路徑。

你的問題有點舊,但是如果你仍然感興趣(或其他人),我有一個類似的場景,我將testdata復制到單元測試目標:

add_custom_command( TARGET ${UTEST_EXE_NAME}
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E echo "Copying unit test data.."
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_HOME_DIRECTORY}/utest/testdata ${CMAKE_BINARY_DIR}
    )

因此,主要思想是使用后構建目標,並在每次構建后執行。 對我來說,數據並不多,而且文件系統會緩存它,所以我根本不會感覺到復制過程。 你可以通過copy_if_different復制來增強它。 但是,在這種情況下,您必須創建一個圖像文件列表並編寫一個循環,因為該命令是基於文件的。 使用GLOB命令,如果需要,這應該不難做到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM