Kompilieren libmagic statisch (C / C ++ Dateityperkennung)
-
22-09-2019 - |
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.
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:
- Extrahiert das heruntergeladene Archiv in meinem Home-Verzeichnis, ungzipping / entpacken Sie das Archiv einen Ordner erstellen namens libmagic .
- Erstellen Sie einen Ordner innerhalb libmagic und nennen es Test
- Kopieren Sie die original magic.c und minifile.c in Test
- 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.