У меня две проблемы, первая была решена.
Текущая проблема
Если я встраиваю файл, для загрузки которого требуется библиотека, например, изображение в формате JPEG илиmp3 музыку, мне нужно будет использовать файл в качестве входных данных для библиотеки.Тем не менее, каждая библиотека отличается и использует способ получить файл в качестве входных данных, входные данные могут быть именем файла или указателем FILE * (из файлового интерфейса libc).
Я хотел бы знать, как получить доступвстроенный файл с именем.Будет неэффективно, если я создам временный файл, есть ли другой способ?Могу ли я сопоставить имя файла с памятью?Мои платформы - Windows и Linux.
Если show_file (const char * name) - это функция из библиотеки, мне понадобится строка для открытия файла.
Я виделэти вопросы:
Как получить файловый дескриптор буфера в памяти?
Получение имени файла из файлового дескриптора в C
и следующий код мойрешение.Это хорошее решение?Это неэффективно?
# include <stdio.h>
# include <unistd.h>
extern char _binary_data_txt_start;
extern const void* _binary_data_txt_size;
const size_t len = (size_t)&_binary_data_txt_size;
void show_file(const char* name){
FILE* file = fopen(name, "r");
if (file == NULL){
printf("Error (show_file): %s\n", name);
return;
}
while (true){
char ch = fgetc(file);
if (feof(file) )
break;
putchar( ch );
}
printf("\n");
fclose(file);
}
int main(){
int fpipe[2];
pipe(fpipe);
if( !fork() ){
for( int buffsize = len, done = 0; buffsize>done; ){
done += write( fpipe[1], &_binary_data_txt_start + done, buffsize-done );
}
_exit(0);
}
close(fpipe[1]);
char name[200];
sprintf(name, "/proc/self/fd/%d", fpipe[0] );
show_file(name);
close(fpipe[0]);
}
Другая проблема (решена)
Я пытался встроить файл в Linux с GCC, и это сработало.Однако я попытался сделать то же самое в Windows, с Mingw, и он не скомпилировался.
Код:
# include <stdio.h>
extern char _binary_data_txt_start;
extern char _binary_data_txt_end;
int main(){
for (char* my_file = &_binary_data_txt_start; my_file <= &_binary_data_txt_end; my_file++)
putchar(*my_file);
printf("\n");
}
Команды компиляции:
objcopy --input-target binary --output-target elf32-i386 --binary-architecture i386 data.txt data.o
g++ main.cpp data.o -o test.exe
В Windows я получаю следующую ошибку компилятора:
undefined reference to `_binary_data_txt_start'
undefined reference to `_binary_data_txt_end'
Я пытался заменить elf32-i386 на i386-pc-mingw32 , ноЯ все еще получаю ту же ошибку.