2010-01-20 1 views
3

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

Почему:

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

Попытка:

Я нашел somebody doing something similar, но я не могу следовать тому, что они делают, и я понятия не имею, как компилировать/запустить что-либо вообще, чтобы начать бездельничать.

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

// 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 

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


Edit: Теперь у меня есть

#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, но это будет по другому вопросу позже, я полагаю.

+2

Публикация сообщений об ошибках, которые вы получаете, будет началом. – 2010-01-20 23:40:17

+0

извините за беспокойство, вы нашли эту библиотеку для Windows? – Tebe

+0

да, конечно, вы его нашли http://gnuwin32.sourceforge.net/packages/file.htm – Tebe

ответ

1

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

Для его компиляции:

 

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

Edit:Благодаря Alok за указание на ошибку здесь ...

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

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

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

+0

Он, возможно, проверял все, поэтому решил найти тип файла-мига самого исходного файла. –

+0

Вы имеете в виду '-L/usr/lib -lmagic', очевидно. –

+0

@Alok: Черт ... еще одна прекрасная ошибка .... Спасибо за указание этого .. :( – t0mm13b

0

Я не знаю, почему вы думаете, что вышеуказанное «очевидно» не работает. См. How to mix C and C++ в номере C++ FAQ.

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

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

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

0

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

Смежные вопросы