Как добавить и использовать ресурс в проекте C99 с CMake, который является переносимым? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь создать проект CMake C99, который будет иметь встроенный ресурс, который может быть прочитан проектом. И этот проект должен быть переносимым. Я на самом деле использую CLion, но я думаю, что это просто вопрос CMake.

В идеале я хотел бы увидеть простой способ внедрения файла helloworld.txt в проект CMake, а затем способ чтения содержимого в переменную const char* helloword_txt = ??. И затем сделайте эту компиляцию с GCC или компилятором Microsoft C ++.

Я посмотрел на проект CMakeRC.cmake, но это похоже на специфический для C ++ способ. Я смотрел на команды как ld -r -b binary -o binary.o foo.bar # then link in binary.o, но они выглядят как специфичные для Linux.

Я думал, что CMake был разработан для переносимых проектов. Есть ли портативный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Сначала я бы использовал FILE *fopen( const char *restrict filename, const char *restrict mode ) из C99 Standard.

Тогда в CMake я бы использовал install(FILES helloworld.txt DESTINATION ${CMAKE_INSTALL_BINDIR})
примечание: CMAKE_INSTALL_BINDIR взято из GNUInstallDirs встроенный модуль.

Затем, используя скрипт bash / bat, вы всегда можете запустить программу из «BIN_DIR», поэтому путь к helloworld.txt будет «.»

например. add_executable(foo_prg ...) ... install(TARGETS foo_prg ...)
/ USR / бен / Foo

  #!/usr/bin/env bash
  cd /usr/bin && ./foo_prg

Таким образом, пользователь может запустить ./foo, который будет "батутить" до /usr/bin, чтобы запустить foo_prg бинарный

Примечание: для тестирования без установки вы можете добавить в CMake:

file(COPY helloworld.txt DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

примечание: не работает для многоконфигурационной сборки, но должно быть легко вывести.
примечание 2: не знаю (то есть никогда не проверял), можем ли мы использовать вместо него $<TARGET_PROPERTY:foo_prg,RUNTIME_OUTPUT_DIRECTORY>.

0 голосов
/ 10 января 2019

Я сомневаюсь, что существует независимая система управления ресурсами. По крайней мере, я не знаю ни одного.

Вы можете взглянуть на qrc Qt - он более или менее переносим, ​​но, конечно, вводит зависимость Qt.

...