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

После поиска способа определить тип файла для файлового потока я обнаружил, что файловая команда 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 ответа

Решение

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

// Этот файл называется test.c
char *p = NULL;
if (!(p = malloc((1 * sizeof(char) + 1)))){
   printf("Ошибка в файле: %s @ line %d\n\tMalloc fail \n", __FILE__, __LINE__);
   Выход (-1);
}

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

Ошибка в файле: test.c @ line 23
       Malloc не удалось

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

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

// fileTypeTest.cpp, помещенный в файл-5.03/src/ (источник по ссылке выше)
#include #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 (мыт,NULL);
     printf("магический вывод: '%s'\n",magic_file(myt,argv[1]));
     magic_close(мыт);
  }
  вернуть 0;
}

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

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

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

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

Если вы не уверены, где находится 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.

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

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

Другие вопросы по тегам