静态编译libmagic(c/c ++文件类型检测)

Kac*_*che 3 c++ compilation libmagic

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

我可以将文件fileTypeTest.cpp,libmagic.a以及magic在一个目录下,我可以编译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.

t0m*_*13b 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进入测试
  4. 使用突出显示差异的封闭diff输出,将其应用到magic.c源.
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;
>       }
>
  • 然后发出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中.让我知道.

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