Frage

Danke an die Jungs, die mich mit meinem vorherige Frage (nur als Referenz verbunden ist).

kann ich legen Sie die Dateien fileTypeTest.cpp, libmagic.a und magic in einem Verzeichnis, und ich kann mit g++ -lmagic fileTypeTest.cpp fileTypeTest kompilieren. Später werde ich, wenn es in Windows mit MinGW kompiliert läuft testen, um zu sehen.

Ich plane über die Verwendung libmagic in einer kleinen GUI-Anwendung, und ich möchte es statisch für die Verteilung zu kompilieren. Mein Problem ist, dass libmagic die externe Datei zu erfordern scheint, magic. (Ich bin meine eigene verkürzt tatsächlich verwenden und kompilierte Version, magic_short.mgc, aber ich schweife ab.)

Eine hacky Lösung wäre, um Code die Datei in der Anwendung, Erstellen von (und Löschen), um die externe Datei nach Bedarf. Wie kann ich das vermeiden?

hinzugefügt für Klarheit:

magic ist eine Textdatei, die Eigenschaften unterschiedlicher Dateitypen beschreibt. Auf die Frage, eine Datei, libmagic durchsucht magic zu identifizieren. Es ist eine kompilierte Version, magic.mgc, die schneller arbeitet. Meine Anwendung benötigt nur eine Handvoll von Dateitypen zu identifizieren, bevor sie entscheidet, was mit ihnen zu tun, so werde ich meine eigene magic_short Datei verwenden magic_short.mgc zu erstellen.

War es hilfreich?

Lösung

Diese kniffligen ist, ich nehme an, Sie es auf diese Weise tun könnte ... übrigens habe ich die libmagic Quelle heruntergeladen und es bei der Suche ...

Es gibt eine Funktion dort magic_read_entries im minifile.c genannt (das ist die reine Vanille-Quelle, dass ich von Source , wo es aus der externen Datei liest.

Sie könnten die magic Datei anhängen (die in der Datei / etc-Verzeichnis gefunden wird) bis zum Ende des Bibliothekscodes, wie dieser cat magic >> libmagic.a. In meinem System magic 474.443 Bytes ist, libmagic.a ist 38588 Bytes.

In der magic.c Datei, müßten Sie die magichandle_t* magic_init(unsigned flags) Funktion ändern, am Ende der Funktion, fügen Sie die Zeile magic_read_entries und ändern Sie die Funktion selbst an der Offset der Bibliothek lesen selbst in den Daten zu ziehen, behandeln als Zeiger auf Zeiger auf dem Zeichen (char **) und die Nutzung, die statt aus der Datei zu lesen. Da Sie wissen, wo das ist die Bibliotheksdaten zum Lesen versetzt, die nicht schwer sein sollte.

Nun wird die Funktion magic_read_entries nicht mehr verwendet werden, da es nicht mehr aus einer Datei gelesen werden soll. Die Funktion `magichandle_t * magic_init (unsigned flags)‘ kümmert sich um die Einträge zu laden und Sie sollten in Ordnung, da sein.

Wenn Sie weitere Hilfe benötigen, lassen Sie mich wissen,

Edit: Ich habe die alte ‚libmagic‘ von sourceforge.net verwendet und hier ist das, was ich getan habe:

  1. Extrahiert das heruntergeladene Archiv in meinem Home-Verzeichnis, ungzipping / entpacken Sie das Archiv einen Ordner erstellen namens libmagic .
  2. Erstellen Sie einen Ordner innerhalb libmagic und nennen es Test
  3. Kopieren Sie die original magic.c und minifile.c in Test
  4. Verwenden Sie die beiliegende Ausgabe von diff Hervorhebung des Unterschiedes, wendet sie auf die magic.c Quelle.
48a49,51
> #define MAGIC_DATA_OFFSET     0x971C
> #define MAGIC_STAT_LIB_NAME "libmagic.a"
>
125a129,130
>       /* magic_read_entries is obsolete... */
>       magic_read_entries(mh, MAGIC_STAT_LIB_NAME);
251c256,262
<
---
>
>       if (!fseek(fp, MAGIC_DATA_OFFSET, SEEK_SET)){
>               if (ftell(fp) != MAGIC_DATA_OFFSET) return 0;
>       }else{
>               return 0;
>       }
>
  • Dann Ausgabe make
  • Die Magie-Datei (die ich von / etc kopiert, unter Slackware Linux 12.2) mit der libmagic.a Datei verkettet, das heißt cat magic >> libmagic.a. Die SHA Prüfsumme für Magie ist (4abf536f2ada050ce945fbba796564342d6c9a61 Magie), hier ist die genauen Daten für Magie (Rw-r - r-- 1 root root 474443 2007-06-03 00.52 / etc / file / Magie). Wie auf meinem System gefunden
  • Hier ist der Unterschied für die minifile.c Quelle, gelten sie und minifile ausführbare wieder aufbauen, indem Sie make wieder.
40c40
<       magic_read_entries(mh,"magic");
---
>       /*magic_read_entries(mh,"magic");*/

Es sollte dann funktionieren. Wenn nicht, müssen Sie den Offset in die Bibliothek einzustellen zum Lesen durch die MAGIC_DATA_OFFSET ändern. Wenn Sie möchten, kann ich die magische Datendatei in Pastebin zukleben. Lassen Sie mich wissen.

Hope, das hilft, Freundliche Grüße, Tom.

Andere Tipps

Ich kann Ihnen sagen, wie eine Bibliothek in statisch kompilieren - Sie einfach den Pfad zur .a-Datei auf dem Ende Ihres g geben ++ Befehl - .a-Dateien sind nur Archive von kompilierten Objekten (.o). „Ldd fileTypeTest“ Verwenden zeigen Ihnen die dynamisch verknüpften Bibliotheken -. $ {} Libdir /libmagic.so nicht drin sein sollte

Was in einer externen Datendatei verknüpft ... Ich weiß nicht, - können Sie die Anwendung nicht-Paket (deb | .rpm | .tar.bz2)? Am Fenster, würde ich einen Installer mit NSIS schreiben.

In der Vergangenheit habe ich selbstextrahierende Archive gebaut. Grundsätzlich ist es eine EXE-Datei, bestehend aus einem ZIP-Archiv und Code zu entpacken. Laden Sie die EXE, führen Sie es, und puh! Sie können so viele Dateien wie Sie wollen.

http://en.wikipedia.org/wiki/Self-extracting_archive

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top