Как лучше всего обрабатывать файлы данных с помощью CMake?

У меня есть проект CMake, который содержит код и несколько файлов данных (точнее, изображений).

Моя структура каталогов такая:

  • src
  • data

src содержит исходный код, данные файлы данных. CMake предлагает исходящие сборки, поэтому, когда я вызываю make , у меня есть исполняемая программа, но нет файлов данных, поэтому я не могу выполнить программу.

Конечно, make install скопирует мои файлы данных в требуемое место и заставит его работать, поэтому я сейчас развиваюсь так:

  1. cmake -DCMAKE_INSTALL_DIR = dist
  2. <редактировать исходный код>
  3. make install
  4. dist / myprogram.exe

Это нормально, если я работаю с командной строкой и редактором, но недавно я решил перейти на Eclipse CDT. Генерация проекта Eclipse из CMake работает отлично, но ручное выполнение цели install из Eclipse не так хорошо.

Как вы, люди, решаете эту проблему? Есть ли у вашей программы какие-нибудь умные алгоритмы, чтобы попытаться найти ее каталог данных, даже если он не там, где находится бинарный файл? Или вы не используете сборки из исходного кода?

19
задан Brian Tompsett - 汤莱恩 18 January 2016 в 13:50
поделиться

2 ответа

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})
18
ответ дан 30 November 2019 в 03:59
поделиться

И если копирование файлов занимает слишком много времени (это изображения...), вы можете сделать это еще лучше, создав "пользовательский" data_header.h с configure_file, который содержит пути к данным, находящимся в вашем исходном каталоге.

Вот что я делаю: У меня есть файл "global_build_config.h.in" в моем исходнике, содержащий следующее:

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

и затем использую configure_file в CMake:

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

Затем я могу #include "Global_Build_Config.h" в моих cpp-файлах и ссылаюсь на фиксированный путь.

11
ответ дан 30 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: