LINUX.ORG.RU

Прошу помощи в конвертации. Компилятор ресурсов res2h.

 , ,


0

2

Преамбула: всю жизнь юзаю винду, и то на уровне пользователя. Но порой руки чешутся и вытворяют всякое. И сейчас они вновь чешутся, но в этот раз я себя чувствую тупым. Для выполнения задачи нужны навыки в области C++, g++, и прямые руки, а меня бог наградил лишь хорошим музыкальным слухом.

Фабула: возникла необходимость исправить бинарный исполняемый файл (отвечает за графический интерфейс в retropie под Raspberry Pi). Elf без видимого расширения. Исходники оного я нашел на гитхабе, скачал, уже исправил что нужно (векторные изображения .svg и файлы шрифтов .ttf) и собрался компилировать заново. Долго курил инструкцию и спустя пару дней удалось его собрать (что меня удивило). Но вот бинарник после этого не запустился, ссылаясь на ошибку в коде - хаха. Хотя по свойствам и содержимому (смотрел через notepad++) ничем не отличался от оригинала. Прочесав еще раз исходники заметил, что внутри кроме векторных изображений есть каталог converted, в котором как-бы копии этих .svg, но с расширением .cpp То есть, получается что-то вроде этого: button_a.svg.cpp В каждом файле текст, в первой строке написано - this file was auto-generated from «arrow.svg» by res2h. За текстом информация о файле (размер) и далее код типа такого: 0x3c,0x3f,0x78. К шрифтам тоже имеются такие файлы. Все эти cpp я, разумеется, не менял, и они содержали инфу неисправленных файлов. Я нашел данную утилиту (и исходники) опять же на гитхабе, и вот с ней уже ничего не получается. Вроде делаю по инструкции, а терминал ругается на несуществующую команду, либо все выполняется с ошибкой.

Поэтому я и зарегился на этом чудесном форуме, в надежде, что кто-нибудь, да поможет конвертировать исправленные исходники. Ибо опыт использования линукса - неделя, познаний в компиляторах и с++ абсолютный ноль. Единственное что могу, это html и css, но это мне никак не поможет. Ссылки на все, что необходимо предоставлю. Инструкция есть, исходники есть - нужны лишь прямые руки. И по времени это не долго, общий размер конвертируемых файлов ~ 100кб.

Вы будете правы, если захотите послать меня куда подальше, я бы и сам так сделал. Но ситуация тупиковая, а идею бросать не хочется - пацан в депрессии.

PS - если кто-то беспокоится о нарушении авторских прав, то заверю, что проект для личного пользования, да и не нарушает по сути ничего, лишь немного изменяет элементы GUI. Всем бобра.


Я нашел данную утилиту (и исходники) опять же на гитхабе, и вот с ней уже ничего не получается. Вроде делаю по инструкции, а терминал ругается на несуществующую команду, либо все выполняется с ошибкой.

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

alozovskoy ★★★★★
()

Но вот бинарник после этого не запустился, ссылаясь на ошибку в коде - хаха.

Давай начнём с этого. Ошибку в студию.

anonymous
()
Ответ на: комментарий от alozovskoy

Все операции выполнялись на чужой машине с убунтой, сейчас ее нет под рукой. А у самого винда. Кстати, эта же утилита и под винду есть, но там команды не работают. Вот тут скачать можно: https://github.com/HorstBaerbel/res2h/releases/tag/v0.4.0

frgn
() автор топика
Ответ на: комментарий от frgn

То что я скачаю ее и запущу у себя совсем не гарантирует того что получу ошибку как у вас, так что лучше таки логи с вашей машины (в смысле с той, на которой запускали ранее).

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

nata@nata-305U1A:~$ cd res2h nata@nata-305U1A:~/res2h$ cmake . m— Boost version: 1.54.0 — Found the following Boost libraries: — system — filesystem — Configuring done — Generating done — Build files have been written to: /home/nata/res2h anata@nata-305U1A:~/res2h$ make [ 20%] Building CXX object CMakeFiles/res2h.dir/src/res2h.cpp.o /home/nata/res2h/src/res2h.cpp:345:155: error: could not convert ‘std::basic_ofstream<char>()’ from ‘std::ofstream {aka std::basic_ofstream<char>}’ to ‘std::ofstream& {aka std::basic_ofstream<char>&}’ bool convertFile(FileData & fileData, const boost::filesystem::path & commonHeaderPath, std::ofstream & outStream = std::ofstream(), bool addHeader = true) ^ /home/nata/res2h/src/res2h.cpp: In function ‘int main(int, const char**)’: /home/nata/res2h/src/res2h.cpp:879:49: error: invalid initialization of non-const reference of type ‘std::ofstream& {aka std::basic_ofstream<char>&}’ from an rvalue of type ‘std::ofstream {aka std::basic_ofstream<char>}’ if (!convertFile(*fdIt, commonHeaderFilePath)) { ^ /home/nata/res2h/src/res2h.cpp:345:6: error: in passing argument 3 of ‘bool convertFile(FileData&, const boost::filesystem::path&, std::ofstream&, bool)’ bool convertFile(FileData & fileData, const boost::filesystem::path & commonHeaderPath, std::ofstream & outStream = std::ofstream(), bool addHeader = true) ^ make[2]: *** [CMakeFiles/res2h.dir/src/res2h.cpp.o] Ошибка 1 make[1]: *** [CMakeFiles/res2h.dir/all] Ошибка 2 make: *** [all] Ошибка 2

frgn
() автор топика
Ответ на: комментарий от anonymous
  • nata@nata-305U1A:~$ cd res2h
  • nata@nata-305U1A:~/res2h$ cmake .
  • m— Boost version: 1.54.0
  • — Found the following Boost libraries:
  • — system
  • — filesystem
  • — Configuring done
  • — Generating done
  • — Build files have been written to: /home/nata/res2h
  • nata@nata-305U1A:~/res2h$ make
  • [ 20%] Building CXX object
  • CMakeFiles/res2h.dir/src/res2h.cpp.o
  • /home/nata/res2h/src/res2h.cpp:345:155: error: could not
  • convert ‘std::basic_ofstream<char>()’ from ‘std::ofstream
  • {aka std::basic_ofstream<char>}’ to ‘std::ofstream& {aka
  • std::basic_ofstream<char>&}’
  • bool convertFile(FileData & fileData, const
  • boost::filesystem::path & commonHeaderPath, std::ofstream &
  • outStream = std::ofstream(), bool addHeader = true)
  • ^
  • /home/nata/res2h/src/res2h.cpp: In function ‘int main(int,
  • const char**)’:
  • /home/nata/res2h/src/res2h.cpp:879:49: error: invalid
  • initialization of non-const reference of type ‘std::ofstream&
  • {aka std::basic_ofstream<char>&}’ from an rvalue of type
  • ‘std::ofstream {aka std::basic_ofstream<char>}’
  • if (!convertFile(*fdIt, commonHeaderFilePath)) {
  • ^
  • /home/nata/res2h/src/res2h.cpp:345:6: error: in passing
  • argument 3 of ‘bool convertFile(FileData&, const
  • boost::filesystem::path&, std::ofstream&, bool)’
  • bool convertFile(FileData & fileData, const
  • boost::filesystem::path & commonHeaderPath, std::ofstream &
  • outStream = std::ofstream(), bool addHeader = true) ^
  • make[2]: *** [CMakeFiles/res2h.dir/src/res2h.cpp.o] Ошибка 1
  • make[1]: *** [CMakeFiles/res2h.dir/all] Ошибка 2
  • make: *** [all] Ошибка 2
frgn
() автор топика
Ответ на: комментарий от anonymous

где заменить? это оно все само пишет по ходу выполнения. я ввожу только три команды - cd res2h, cmake ., make

frgn
() автор топика
Ответ на: комментарий от frgn

В оригинальном res2h.cpp строка 356 выглядит так bool convertFile(FileData & fileData, const FS_NAMESPACE::path & commonHeaderPath, std::ofstream & outStream = badOfStream, bool addHeader = true)

Откуда у тебя std::ofstream & outStream = std::ofstream() - не ведомо. Исправь на как в оригинале.

anonymous
()
Ответ на: -- от frgn

никто еще на своем железе не пробовал? фишка в том, что ноут с убунтой не мой, взять в руки я его смогу теперь только на выходные. :с

по поводу ошибок - в инструкции на гитхабе сказано, что должен быть установлен visual studio 2015, а оного на том ноуте нет, он вообще к слову доживает свою нелегкую жизнь.

frgn
() автор топика
Ответ на: комментарий от frgn

GIMP - это графический редактор такой? как он мне поможет?

Загрузите нужное изображение в GIMP, а потом экспортируйте его в нужный вам формат. GIMP умеет экспортить как c-array.

andreyu ★★★★★
()
Ответ на: комментарий от anonymous

какой ограниченный мальчик

anonymous
()
Ответ на: комментарий от andreyu

попробовал экспорт в .h и .c — все не то! у этих .cpp должна быть такая структура (если открыть в текстовом редакторе):

//this file was auto-generated from «arrow.svg» by res2h

#include "../Resources.h"

const size_t arrow_svg_size = 838;
const unsigned char arrow_svg_data[838] = {
0x3c,0x3f,0x78,0x6d,0x6c,0x20,0x76,0x65,0x72,0x73,
0x69,0x6f,0x6e,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,
0x65,0x6e,0x63,0x6f,0x64,0x69,0x6e,0x67,0x3d,0x22,
0x75,0x74,0x66,0x2d,0x38,0x22,0x3f,0x3e,0x0a,0x3c,
0x0a,0x3c,0x2f,0x73,0x76,0x67,0x3e,0x0a
};

из гимпа же получается вообще хрен знает что.

frgn
() автор топика
Ответ на: комментарий от andreyu

пробовал в разных версиях - на выходе получается все, кроме нужной мне структуры. что h, что c.
но я погуглил про c-array и нашел утилиту - bin2h. она вроде под винду, но при запуске экзешника на секунду мелькает окно cmd и все.
не понятно, как с ней работать. инструкций не могу найти. может есть что с gui?

frgn
() автор топика
Ответ на: комментарий от frgn

Экспорт в C:

static const struct {
  unsigned int 	 width;
  unsigned int 	 height;
  unsigned int 	 bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ 
  unsigned char	 pixel_data[1980 * 1134 * 4 + 1];
} gimp_image = {
  1980, 1134, 4,
  "\332\334\333\377\332\334\333\377\332\334\333\377\332\334\333\377\332\334"
// поскипано лишнее
};

Экспорт в H:

/*  GIMP header image file format (RGB): /Users/andrey/Desktop/Screen Shot 2016-11-22 at 8.09.38 PM.h  */

static unsigned int width = 1980;
static unsigned int height = 1134;

/*  Call this macro repeatedly.  After each use, the pixel data can be extracted  */

#define HEADER_PIXEL(data,pixel) {\
pixel[0] = (((data[0] - 33) << 2) | ((data[1] - 33) >> 4)); \
pixel[1] = ((((data[1] - 33) & 0xF) << 4) | ((data[2] - 33) >> 2)); \
pixel[2] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33))); \
data += 4; \
}
static char *header_data =
	"WNT<WNT<WNT<WNT<WNT<WNT<WNT<WNT<WNT<WNT<WNT<WNT<WNT<WNT<WNT<WNT<"
// поскипано

Что именно вас не устроило в экспорте?

andreyu ★★★★★
()
od -v -An -t x1 input_file | sed 's/ *\([^ ]\{2\}\) */ 0x\1,/g' | (printf '#ifndef %s\n#define %s {\\\n' "RES_NAME" "RES_NAME" && sed 's/$/\\/' && printf '}\n#endif\n') > output_file

Допилите под свои нужды, и не надо никакого res2h.

Sorcerer ★★★★★
()
Ответ на: комментарий от andreyu

и у меня тоже самое, только в .c вообще прочерки одни. в .cpp должно быть такое:

//this file was auto-generated from "arrow.svg" by res2h

#include "../Resources.h"

const size_t arrow_svg_size = 838;
const unsigned char arrow_svg_data[838] = {
    0x3c,0x3f,0x78,0x6d,0x6c,0x20,0x76,0x65,0x72,0x73,
    0x69,0x6f,0x6e,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,
    0x65,0x6e,0x63,0x6f,0x64,0x69,0x6e,0x67,0x3d,0x22,
    0x75,0x74,0x66,0x2d,0x38,0x22,0x3f,0x3e,0x0a,0x3c,
    0x21,0x2d,0x2d,0x20,0x47,0x65,0x6e,0x65,0x72,0x61,
    0x74,0x6f,0x72,0x3a,0x20,0x41,0x64,0x6f,0x62,0x65,
    0x20,0x49,0x6c,0x6c,0x75,0x73,0x74,0x72,0x61,0x74,
    0x6f,0x72,0x20,0x31,0x36,0x2e,0x30,0x2e,0x33,0x2c,


не устраивает то, что из гима выходит совсем не то. 
frgn
() автор топика
Ответ на: комментарий от Sorcerer

Допилите под свои нужды, и не надо никакого res2h.

и что с этим делать? я же писал, что вообще не шарю в этом.

frgn
() автор топика
Ответ на: комментарий от frgn

Запустите, заменив input_file на файл ресурсов, и посмотрите создавшийся output_file.

Sorcerer ★★★★★
()
Ответ на: комментарий от andreyu

тогда так. мне нужен c-array именно такого вида:

const unsigned char arrow_svg_data[838] = {
    0x3c,0x3f,0x78,0x6d,0x6c,0x20,0x76,0x65,0x72,0x73,
    0x69,0x6f,0x6e,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,
    0x65,0x6e,0x63,0x6f,0x64,0x69,0x6e,0x67,0x3d,0x22,
    0x75,0x74,0x66,0x2d,0x38,0x22,0x3f,0x3e,0x0a,0x3c,
    0x21,0x2d,0x2d,0x20,0x47,0x65,0x6e,0x65,0x72,0x61,
    0x74,0x6f,0x72,0x3a,0x20,0x41,0x64,0x6f,0x62,0x65,
    0x20,0x49,0x6c,0x6c,0x75,0x73,0x74,0x72,0x61,0x74,
    0x6f,0x72,0x20,0x31,0x36,0x2e,0x30,0x2e,0x33,0x2c,

гимп в такой код не может, а если компилировать бинарник с гимповым кодом, то больше чем уверен - ничего не взлетит.

повторюсь - нужна помощь с res2h или bin2h (bin2header).
я нашел экзешники, но не знаю как с ними работать.
в линуксе или на винде?
пробовал перетащить res2h.exe в cmd — по нажатии enter он вроде открывается, и даже дает инструкции:

Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:\Windows\System32>C:\1\res2h.exe
res2h 0.4.0.0 - built Aug  9 2013 - 20:30:50 - Load plain binary data and dump t
o a raw C/C++ array.


Usage: res2h <infile/indir> <outfile/outdir> [options]
Valid options:
-s Recurse into subdirectories below indir.
-c Use .c files and arrays for storing the data definitions, else
    uses .cpp files and std::vector/std::map.
-h <headerfile> Puts all declarations in a common "headerfile" using "extern"
    and includes that header file in the source files.
-u <sourcefile> Create utility functions and arrays in a .c/.cpp file.
    Only makes sense in combination with -h
-1 Combine all converted files into one big .c/.cpp file (use with -u).
-b Compile binary archive outfile containing all infile(s). For reading in your
    software include res2hinterface.h/.c/.cpp (depending on -c) and consult the
docs.
-a Append infile to outfile. Can be used to append an archive to an executable.
-v Be verbose.
Examples:
res2h ./lenna.png ./resources/lenna_png.cpp (convert single file)
res2h ./data ./resources -s -h resources.h -u resources.cpp (convert directory)
res2h ./data ./resources/data.bin -b (convert directory to binary file)
res2h ./resources/data.bin ./program.exe -a (append archive to executable)

C:\Windows\System32>

далее он предлагает мне вводить пути исходника и готового цепепе, но как это сделать? как ни пытался, выводится сообщение:

res2h не является внутренней или внешней командой, исполняемой програмой или пакетным файлом

(с bin2h идентичная история)

может, этот exe надо в убунте открыть? и как именно вводить команды, чтобы хотя бы по одному сделать? всего надо конвертировать 17 файлов.

простите за такие уж совсем нубские вопросы.

frgn
() автор топика
Ответ на: комментарий от frgn

Путь к res2h надо добавить в переменную PATH. В виндовсах это как-то так делать надо в данном случае:

PATH=%PATH%;C:\1
Т.е. указывается путь к директории, где этот res2h находится. https://stackoverflow.com/questions/9546324/adding-directory-to-path-environm...

А еще можно просто прописывать каждый раз полный путь к этому res2h, и тогда таких проблем не будет.

Вопросы действительно очень нубские, и к линуксу отношения не имеют

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от andreyu

Из гимпа получается тоже самое - c-array с размерами изображения.

Гимп втулит туда RAW картинку с значениями цветов для каждого пикселя, а нужно судя по всему просто засунуть файл без каких либо переконвертаций. Если перевести эти вот hex-коды

0x69,0x6f,0x6e,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20,

в текст, то там будет <?xml vers а SVG как раз на XML основан

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от frgn

гимп в такой код не может, а если компилировать бинарник с гимповым кодом, то больше чем уверен - ничего не взлетит.

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

andreyu ★★★★★
()
Ответ на: комментарий от SZT

Гимп втулит туда RAW картинку с значениями цветов для каждого пикселя, а нужно судя по всему просто засунуть файл без каких либо переконвертаций. Если перевести эти вот hex-коды

Вот с этого и нужно было ТСу начать. В таком случае гимп ему не поможет и нужна сторонняя утилита, например моя:
https://bitbucket.org/andreyu/bin2hpp.git

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Таких утилит уже сделано достаточно много, например file2c, xxd и уже вышеупомянутые file2c, res2c. Проблема всех этих утилит в том, что при больших размерах конвертируемого файла, компилятор начинает сильно тупить на сгенерированном «исходнике». И в таких случаях лучше использовать objcopy

https://balau82.wordpress.com/2012/02/19/linking-a-binary-blob-with-gcc/

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от SZT

и уже вышеупомянутые bin2h, res2c

Опечатался. Вообще я несколько удивлен, что так много утилит для этого сделали, там ведь нельзя ничего принципиально улучшить

SZT ★★★★★
()
Ответ на: комментарий от SZT

Видимо это потому, что проще написать пару строк кода, чем гуглить готовое решение.

andreyu ★★★★★
()
Ответ на: комментарий от SZT

ееее, наканец-та! такую простыню развели, а решение оказалось до смешного простым:
1. засунуть в папку с res2h.exe исходник
2. нажать правой кнопкой с зажатым шифтом в окне и выбрать открыть окно команд
3. выполнить конвертацию командой res2h.exe file_to_convert.ext output_file.cpp -c
4. все!

всем спасибо за внимание.

frgn
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.