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