Intentando usar/incluir/compilar una biblioteca de terceros, Libmagic. Detección del tipo de archivo C/C ++

StackOverflow https://stackoverflow.com/questions/2105816

  •  21-09-2019
  •  | 
  •  

Pregunta

Después de buscar una forma de detectar el tipo de archivo de una secuencia de archivos, descubrí que el UNIX Comando de archivo Utiliza Libmagic y estoy tratando de hacer uso de la biblioteca yo mismo, pero no puedo hacer que funcione. Raramente he integrado el código de terceros en mi cuenta, por lo que probablemente también sea una gran parte de mi problema.

Por qué:

Estoy haciendo esto porque tengo una aplicación portátil de visualización de imágenes GUI que necesitará detectar los tipos de archivos de archivo (¿rar, zip, más?) Del nombre de archivo dado y luego los tipos de archivos de imagen dentro. Espero poder usar LibMagic para Windows y Linux (y Mac), por lo que si este no es el caso, detenme ahora b/c necesitaré encontrar algo más.

Intentar:

encontré Alguien haciendo algo similar, pero no puedo seguir lo que están haciendo, y no tengo idea de cómo compilar/ejecutar nada para comenzar a jugar.

Mi primer instinto fue hacer algo como:

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

Luego compile con algo como:

$ gcc magic.c -o magic.o
$ g++ fileTypeTest.cpp -o fileTypeTest magic.o

Lo que (¿obviamente?) No funciona. Ni siquiera sé por dónde comenzar a buscar, qué preguntas hacer, o si esta es la dirección correcta para resolver mi problema original en primer lugar.


Editar: ahora tengo

#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;
}

compilación con:

$ g++ -L/usr/lib -libmagic fileTypeTest.cpp -o fileTypeTest

obras. Sin embargo, tuve que ir a sináptico e instalar Libmagic-Dev. Tendré que probar para ver si puedo copiar /usr/lib/libmagic.a en mi directorio fuente al compilar mi aplicación en el Mingw de Windows, pero eso será para otra pregunta más adelante, supongo.

¿Fue útil?

Solución

__FILE__ es un símbolo de preprocesamiento reservado macro utilizado para fines de depuración/registro. Considere esto como un ejemplo:

// 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);
}

Si la llamada a malloc Falló que verá la salida en el ejemplo anterior como este:

Error in file: test.c @ line 23
       Malloc failed

Observe cómo el código recoge el código fuente original. El ejemplo anterior ilustra el uso de esto.

Creo que tu código debería ser algo como esto:

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

El código anterior verifica si hay un parámetro que se pasa a este programa y el parámetro sería un nombre de archivo, es decir argv[0] apunta al nombre ejecutable (el binario compilado), argv[1] señala la matriz de caracteres (una cadena) que indica el nombre de archivo en cuestión.

Para compilarlo:

g ++ -i/usr/include -l/usr/lib/libmagic.so filetesttype.cpp -o filetesttype
g++ -L/usr/lib -lmagic fileTestType.cpp -o fileTestType

Editar: Gracias ALOK por señalar el error aquí ...

Si no está seguro de dónde reside el libmágico, búscalo en el/usr/local/lib y/usr/local/include, esto depende de su instalación.

Vea esto para encontrar las macros predefinidas aquí.

Espero que esto ayude, Saludos cordiales, Tom.

Otros consejos

Dónde está magic.h en el sistema de archivos? ¿El preprocesador lo está encontrando? Si no, usa -I<path>.

No sé por qué crees que lo anterior "obviamente" no funciona. Ver Cómo mezclar C y C ++ en el Preguntas frecuentes de C ++ para detalles.

Parece magic.h tiene apropiado extern "C" { } recintos. Entonces, compilando su código con g++ debería funcionar bien. Puedes #include <magic.h> en tus .cpp archivo y use todas las funciones libmágicas.

  • ¿Hay algún error en particular que reciba?
  • No he verificado su uso de las funciones libmágicas.
  • Necesitas vincularte con Libmagic. Su g++ necesidades de comando -lmagic.
  • Ya que magic.h es muy probable que en un lugar estándar, debe usar #include <magic.h>.

Díganos cuál es su error para una ayuda más específica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top