Попытка использовать / включить / скомпилировать стороннюю библиотеку, libmagic. Обнаружение типов файлов C / C ++ - PullRequest
3 голосов
/ 21 января 2010

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

Почему:

Я делаю это, потому что у меня есть портативное приложение для просмотра изображений с графическим интерфейсом, которое должно будет определять типы архивных файлов (rar, zip, more?) По заданному имени файла, а затем типы файлов изображений внутри. Я надеюсь, что смогу использовать 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 в каталог с исходными кодами при компиляции моего приложения на Windows MingW, но это будет другой вопрос позже, я полагаю.

Ответы [ 3 ]

1 голос
/ 21 января 2010

__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] указывает на массив символов (строка), указывающая имя файла в вопросе.

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

<strike>g++ -I/usr/include -L/usr/lib/libmagic.so  fileTestType.cpp -o fileTestType</strike>
g++ -L/usr/lib -lmagic fileTestType.cpp -o fileTestType

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

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

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

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 21 января 2010

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

0 голосов
/ 21 января 2010

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

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

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

Сообщите нам, в чем ваша ошибка, чтобы получить более конкретную помощь.

...