Попытка использовать/включить/составить стороннюю библиотеку, Libmagic. C/C ++ обнаружение филетипов

StackOverflow https://stackoverflow.com/questions/2105816

  •  21-09-2019
  •  | 
  •  

Вопрос

После поиска способа обнаружения филетипа потока файла, я обнаружил, что Unix файл команда Использует Libmagic, и я сам пытаюсь использовать библиотеку, но я не могу заставить ее работать. Я редко интегрировал сторонний код сам по себе, так что это, вероятно, большая часть моей проблемы.

Почему:

Я делаю это, потому что у меня есть приложение для просмотра портативного графического интерфейса, которое необходимо будет обнаружить типы архивных файлов (rar, Zip, больше?) Из данного имени файла, а затем типы файлов изображения внутри. Я надеюсь, что смогу использовать Libmagic для Windows и Linux (и Mac), поэтому, если это не так, остановите меня сейчас, потому что мне нужно найти что -то еще.

Пытаться:

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

Мой первый инстинкт - сделать что -то вроде:

// fileTypeTest.cpp, placed in file-5.03/src/ (source from link above)
#include <stdio.h>
#include "magic.h"
int main() {
  magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME);
  magic_load(myt,NULL);
  printf("magic output: '%s'\n",magic_file(myt,__FILE__));
  magic_close(myt);

  return 0;
}

затем компилируйте с чем -то вроде:

$ gcc magic.c -o magic.o
$ g++ fileTypeTest.cpp -o fileTypeTest magic.o

Что (очевидно?) Не работает. Я даже не знаю, с чего начать искать, какие вопросы задать или если это правильное направление, чтобы решить мою первоначальную проблему в первую очередь.


РЕДАКТИРОВАТЬ: теперь у меня

#include    <stdio.h>
#include    <magic.h>

int main(int argc, char* argv[]) {
  if (argc != 2) {
    printf("bad arguments");
    return 0;
  }
  magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME);
  magic_load(myt,NULL);
  printf("magic output: '%s'\n", magic_file(myt, argv[1]));
  magic_close(myt);

  return 0;
}

Компиляция с:

$ g++ -L/usr/lib -libmagic fileTypeTest.cpp -o fileTypeTest

работает. Я должен был пойти в Synaptic и установить Libmagic-Dev, хотя. Мне придется проверить, смогу ли я просто скопировать/usr/lib/libmagic.a в свой исходный каталог при составлении моего приложения в Mingw Windows, но это будет для другого вопроса позже, я полагаю.

Это было полезно?

Решение

__FILE__ является зарезервированным макросом символа предварительной обработки, используемым в целях отладки/ведения журнала. Рассмотрим это в качестве примера:

// This file is called test.c
char *p = NULL;
if (!(p = malloc((1 * sizeof(char) + 1)))){
   printf("Error in file: %s @ line %d\n\tMalloc failed\n", __FILE__, __LINE__);
   exit(-1);
}

Если призыв к malloc Не удалось, вы увидите вывод в приведенном выше примере, например:

Error in file: test.c @ line 23
       Malloc failed

Обратите внимание, как код поднимает исходный исходный код. Приведенный выше пример иллюстрирует использование этого.

Я думаю, что ваш код должен быть чем -то вроде этого:

// fileTypeTest.cpp, placed in file-5.03/src/ (source from link above)
#include <stdio.h>
#include "magic.h"
int main(int argc, char **argv) {
  if (argc > 1){
     magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME);
     magic_load(myt,NULL);
     printf("magic output: '%s'\n",magic_file(myt,argv[1]));
     magic_close(myt);
  }
  return 0;
}

Приведенный выше код проверяет, если есть параметр, который внесен в эту программу, и параметр был бы именем файла, т.е. argv[0] указывает на исполняемое имя (скомпилированный бинарный), argv[1] указывает на массив Chars (строка), указывающий на рассматриваемое имя файла.

Чтобы скомпилировать это:

g ++ -i/usr/include -l/usr/lib/libmagic.so filetesttype.cpp -o filetesttype
g++ -L/usr/lib -lmagic fileTestType.cpp -o fileTestType

Редактировать: Спасибо Алок Для указания на ошибку здесь ...

Если вы не уверены, где проживает Libmagic, ищите его в/usr/local/lib и/usr/local/include - это зависит от вашей установки.

Смотрите, чтобы найти предопределенные макросы здесь.

Надеюсь, это поможет, с уважением, Том.

Другие советы

Где magic.h в файловой системе? Препроцессор находит это? Если нет, используйте -I<path>.

Я не знаю, почему вы думаете, что вышеперечисленное «очевидно» не работает. Видеть Как смешать C и C ++ в C ++ FAQ Для деталей.

Похоже magic.h имеет правильный extern "C" { } Корты. Итак, скомпилируйте ваш код с g++ должен работать хорошо. Вы можете #include <magic.h> в твоей .cpp Файл и используйте все либмагические функции.

  • Есть ли конкретная ошибка, которую вы получаете?
  • Я не проверил ваше использование либмагических функций.
  • Вам нужно связать с Libmagic. Ваш g++ Командные потребности -lmagic.
  • С magic.h Скорее всего, в стандартном месте, вы должны использовать #include <magic.h>.

Расскажите нам, какая ваша ошибка для более конкретной помощи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top