3

感谢帮助我解决上一个问题的人(链接仅供参考)。

我可以将文件fileTypeTest.cpplibmagic.amagic放在一个目录中,并且可以使用g++ -lmagic fileTypeTest.cpp fileTypeTest. 稍后,我将测试它是否可以在使用 MinGW 编译的 Windows 中运行。

我打算在一个小型 GUI 应用程序中使用libmagic,我想静态编译它以进行分发。我的问题是这libmagic似乎需要外部文件,magic. (我实际上使用的是我自己的缩短和编译版本,magic_short.mgc,但我离题了。)

一个 hacky 的解决方案是将文件编码到应用程序中,根据需要创建(和删除)外部文件。我怎样才能避免这种情况?

为清楚起见添加:

magic是描述不同文件类型属性的文本文件。当被要求识别文件时,libmagic搜索magic. 有一个编译版本,magic.mgc运行速度更快。我的应用程序只需要在决定如何处理它们之前识别少数文件类型,所以我将使用我自己的magic_short文件来创建magic_short.mgc.

4

3 回答 3

5

这很棘手,我想你可以这样做......顺便说一句,我已经下载了 libmagic 源并查看了它......

magic_read_entries里面有一个函数调用minifile.c(这是我从sourceforge下载的纯香草源代码,它正在从外部文件中读取。

您可以将magic文件(位于 /etc 目录中)附加到库代码的末尾,如下所示cat magic >> libmagic.a。在我的系统中,magic是474443字节,libmagic.a是38588字节。

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.c复制到Test
  4. 使用封闭的 diff 输出突出显示差异,将其应用于magic.c源。
48a49,51
> #define 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)){
> 如果 (ftell(fp) != MAGIC_DATA_OFFSET) 返回 0;
> }其他{
> 返回 0;
> }
>
  • 然后发出make
  • 魔术文件(我在 Slackware Linux 12.2 下从 /etc 复制)连接到 libmagic.a 文件,即cat magic >> libmagic.a. 魔术的 SHA 校验和是 (4abf536f2ada050ce945fbba796564342d6c9a61 magic),这是魔术的确切数据 (-rw-r--r-- 1 root root 474443 2007-06-03 00:52 /etc/file/magic)系统。
  • 这是minifile.c源的差异,应用它并通过再次运行make重建 minifile 可执行文件。
40c40
<magic_read_entries(mh,"magic");
---
> /*magic_read_entries(mh,"magic");*/

它应该工作。如果没有,您将需要通过修改 MAGIC_DATA_OFFSET 来调整库中的偏移量以供读取。如果您愿意,我可以将魔术数据文件粘贴到 pastebin 中。让我知道。

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-23T23:19:30.347 回答
1

我可以告诉你如何静态编译一个库——你只需在你的 g++ 命令的末尾传递 .a 文件的路径——.a 文件只是编译对象(.o)的档案。使用“ldd fileTypeTest”将显示动态链接库 - ${libdir}/libmagic.so 不应该在其中。

至于在外部数据文件中的链接...我不知道 - 你不能打包应用程序(.deb|.rpm|.tar.bz2)吗?在 Windows 上,我会使用 NSIS 编写安装程序。

于 2010-01-23T21:35:42.247 回答
0

在过去,我建立了自解压档案。基本上它是一个 .exe 文件,由一个 .zip 存档和解压缩它的代码组成。下载.exe,运行它,然后噗!您可以拥有任意数量的文件。

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

于 2010-01-23T21:55:11.463 回答