Essayer d’utiliser / inclure / comstackr une bibliothèque tierce, libmagic. Détection de type de fichier C / C ++

Après avoir cherché un moyen de détecter le type de fichier d’un stream de fichiers, j’ai constaté que la commande de fichier Unix utilisait libmagic et j’essayais moi-même d’utiliser la bibliothèque, mais je n’arrivais pas à l’utiliser. J’ai rarement intégré le code de tiers dans le mien, alors c’est probablement aussi une grande partie de mon problème.

Pourquoi:

Je le fais parce que j’ai une application de visualisation d’image gui portable qui devra détecter les types de fichiers d’archive (rar, zip, more?) À partir d’un nom de fichier donné, puis les types de fichiers d’image qu’il contient. J’espère pouvoir utiliser libmagic pour Windows et Linux (et Mac), donc si ce n’est pas le cas, arrêtez-moi maintenant, car je devrai trouver autre chose.

Tentative:

J’ai trouvé quelqu’un qui fait quelque chose de similaire , mais je ne peux pas suivre ce qu’il fait, et je ne sais pas comment comstackr / exécuter quoi que ce soit pour commencer à déconner.

Mon premier instinct a été de faire quelque chose comme:

// fileTypeTest.cpp, placed in file-5.03/src/ (source from link above) #include  #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; } 

puis comstackz avec quelque chose comme:

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

qui (évidemment?) ne fonctionne pas. Je ne sais même pas par où commencer, quelles questions poser, ou si c’est la bonne direction à prendre pour résoudre mon problème initial.


Edit: maintenant j’ai

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

comstackr avec:

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

travaux. Je devais cependant aller sur synaptic et installer libmagic-dev. Je vais devoir vérifier si je peux simplement copier /usr/lib/libmagic.a dans mon répertoire source lors de la compilation de mon application sur MingW de Windows, mais ce sera pour une autre question plus tard, je suppose.

__FILE__ est une macro de symbole de pré-traitement réservée utilisée à des fins de débogage / journalisation. Considérez ceci comme un exemple:

 // Ce fichier s'appelle test.c
 char * p = NULL;
 si (! (p = malloc ((1 * sizeof (char) + 1))))) {
    printf ("Erreur dans le fichier:% s @ ligne% d \ n \ tMalloc a échoué \ n", __FILE__, __LINE__);
    sortie (-1);
 }

Si l’appel à malloc échoué, vous verrez la sortie dans l’exemple ci-dessus comme ceci:

 Erreur dans le fichier: test.c @ ligne 23
        Malloc a échoué

Remarquez comment le code récupère le code source d’origine. L’exemple ci-dessus illustre l’utilisation de cela.

Je pense que votre code devrait être quelque chose comme ça:

 // fileTypeTest.cpp, placé dans le fichier-5.03 / src / (source à partir du lien ci-dessus)
 #include 
 #include "magic.h"
 int main (int argc, char ** argv) {
   si (argc> 1) {
      magic_t myt = magic_open (MAGIC_CONTINUE | MAGIC_ERROR / * | MAGIC_DEBUG * / | MAGIC_MIME);
      magic_load (myt, NULL);
      printf ("sortie magique: '% s' \ n", magic_file (myt, argv [1]));
      magic_close (myt);
   }
   retourne 0;
 }

Le code ci-dessus vérifie si un paramètre est passé dans ce programme et qu’il s’agirait d’un nom de fichier. Par exemple, argv[0] pointe sur le nom de l’exécutable (le binary compilé), argv[1] pointe sur le tableau de caractères ( une chaîne) indiquant le nom du fichier en question.

Pour le comstackr:

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

Edit: Merci Alok pour avoir signalé l’erreur ici …

Si vous ne savez pas où réside libmagic, recherchez-le dans / usr / local / lib et / usr / local / include – cela dépend de votre installation.

Voir ceci pour trouver les macros prédéfinies ici .

J’espère que cela vous aidera, Cordialement, Tom.

Où se trouve magic.h dans le système de fichiers? Le préprocesseur le trouve-t-il? Sinon, utilisez -I .

Je ne sais pas pourquoi vous pensez que ce qui précède “évidemment” ne fonctionne pas. Voir Comment mélanger C et C ++ dans la FAQ sur C ++ pour plus de détails.

On dirait que magic.h a des magic.h appropriés extern "C" { } . Donc, comstackr votre code avec g++ devrait fonctionner correctement. Vous pouvez #include dans votre fichier .cpp et utiliser toutes les fonctions de libmagic.

  • Y a-t-il une erreur particulière que vous obtenez?
  • Je n’ai pas vérifié votre utilisation des fonctions libmagic.
  • Vous devez établir un lien avec libmagic. Votre commande g++ nécessite -lmagic .
  • Comme magic.h est probablement dans un endroit standard, vous devriez utiliser #include .

Dites-nous quelle est votre erreur pour une aide plus spécifique.