3

私の以前の質問を手伝ってくれた人たちに感謝します(参照用にリンクされています)。

ファイルfileTypeTest.cpplibmagic.a、およびmagicをディレクトリに配置し、 でコンパイルできますg++ -lmagic fileTypeTest.cpp fileTypeTest。後で、MinGW でコンパイルされた Windows で動作するかどうかをテストします。

小さな GUI アプリケーションでlibmagicを使用する予定で、配布用に静的にコンパイルしたいと考えています。私の問題はlibmagic、外部ファイルmagic. (実際には、短縮してコンパイルした独自のバージョンの magic_short.mgc を使用していますが、余談になります。)

ハックな解決策は、ファイルをアプリケーションにコーディングし、必要に応じて外部ファイルを作成 (および削除) することです。どうすればこれを回避できますか?

明確にするために追加されました:

magicさまざまなファイル タイプのプロパティを記述したテキスト ファイルです。ファイルの識別を求められると、libmagicを検索しmagicます。より高速に動作するコンパイル済みバージョンがありmagic.mgcます。私のアプリケーションは、何をすべきかを決定する前に、ほんの一握りのファイルタイプを識別するだけでよいので、独自のmagic_shortファイルを使用してmagic_short.mgc.

4

3 に答える 3

5

これはトリッキーです。この方法でできると思います...ちなみに、libmagicソースをダウンロードして見ました...

magic_read_entries内で呼び出される関数があります (これは、外部ファイルから読み取っているsourceforgeminifile.cからダウンロードした純粋なバニラ ソースです。

magic次のように、ファイル (/etc ディレクトリにあります) をライブラリ コードの末尾に追加できますcat magic >> libmagic.a。私のシステムでmagicは、474443 バイト、libmagic.a38588 バイトです。

magic.cファイルでは、関数を変更する必要があります。関数magichandle_t* magic_init(unsigned flags)の最後に行を追加しmagic_read_entries、関数自体を変更して、ライブラリ自体のオフセットを読み取ってデータを取り込み、ポインタへのポインタとして扱います。 char の (char **) ファイルから読み取る代わりにそれを使用します。読み取り用のライブラリ データへのオフセットがどこにあるかがわかっているので、それは難しくありません。

magic_read_entriesファイルから読み取られなくなるため、この関数は使用されなくなります。関数 `magichandle_t* magic_init(unsigned flags)' がエントリのロードを処理するので、問題ないはずです。

さらにサポートが必要な場合はお知らせください。

編集: sourceforge.net の古い「libmagic」を使用しました。これが私がしたことです:

  1. ダウンロードしたアーカイブをホームディレクトリに抽出し、アーカイブを解凍/展開すると、 libmagicというフォルダーが作成されます。
  2. libmagic 内にフォルダーを作成し、Testという名前を付けます。
  3. オリジナルのmagic.cminifile.cTestにコピーします。
  4. 同封の diff 出力を使用して違いを強調表示し、それをmagic.cソースに適用します。
48a49,51
> #MAGIC_DATA_OFFSET 0x971C を定義
> #define MAGIC_STAT_LIB_NAME "libmagic.a"
>
125a129,130
> /* magic_read_entries は廃止されました... */
> magic_read_entries(mh, MAGIC_STAT_LIB_NAME);
251c256,262
<
---
>
> if (!fseek(fp, MAGIC_DATA_OFFSET, SEEK_SET)){
> if (ftell(fp) != MAGIC_DATA_OFFSET) リターン 0;
>}その他{
> 0 を返します。
> }
>
  • その後、makeを発行します
  • マジック ファイル (Slackware Linux 12.2 で /etc からコピーしたもの) は、libmagic.a ファイル、つまりcat magic >> libmagic.a. 魔法の SHA チェックサムは (4abf536f2ada050ce945fbba796564342d6c9a61 魔法) です。システム。
  • これはminifile.cソースの差分です。これを適用し、 make を再度実行してミニファイル実行可能ファイルを再構築します。
40c40
< magic_read_entries(mh,"マジック");
---
> /*magic_read_entries(mh,"magic");*/

それでうまくいくはずです。そうでない場合は、MAGIC_DATA_OFFSET を変更して、読み取り用にライブラリへのオフセットを調整する必要があります。ご希望であれば、魔法のデータ ファイルをペーストビンに貼り付けます。お知らせ下さい。

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-01-23T23:19:30.347 に答える
1

ライブラリを静的にコンパイルする方法を説明できます。g++コマンドの最後に.aファイルへのパスを渡すだけです。.aファイルはコンパイルされたオブジェクト(.o)の単なるアーカイブです。「lddfileTypeTest」を使用すると、ダイナミックリンクライブラリが表示されます-${libdir}/libmagic.soはその中に含まれていてはなりません。

外部データファイルへのリンクについては…わかりません-アプリケーション(.deb | .rpm | .tar.bz2)をパッケージ化できませんか?Windowsでは、NSISを使用してインストーラーを作成します。

于 2010-01-23T21:35:42.247 に答える
0

過去に、自己解凍アーカイブを作成しました。基本的には、.zip アーカイブとそれを解凍するコードで構成される .exe ファイルです。.exe をダウンロードし、実行してください。必要な数のファイルを持つことができます。

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

于 2010-01-23T21:55:11.463 に答える