Попытка использовать / включить / скомпилировать стороннюю библиотеку, 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 fileTestTypeg ++ -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>
,
Скажите нам, в чем ваша ошибка для более конкретной помощи.