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

感谢帮助我使用previous question的人(仅供参考).

我可以将文件fileTypeTest.cpp,libmagic.a和magic放在一个目录中,我可以使用g -lmagic fileTypeTest.cpp fileTypeTest进行编译.稍后,我将测试它是否在使用MinGW编译的Windows中运行.

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

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

为清晰起见添加:

magic是一个描述不同文件类型属性的文本文件.当被要求识别文件时,libmagic会搜索魔法.有一个编译版本,magic.mgc更快.我的应用程序只需要确定一些文件类型,然后再决定如何处理它们,所以我将使用自己的magic_short文件来创建magic_short.mgc.

解决方法:

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

minifile.c中有一个名为magic_read_entries的函数(这是我从sourceforge下载的纯香草源,它从外部文件中读取.

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

在magic.c文件中,您需要更改magichandle_t * magic_init(无符号标志)函数,在函数末尾添加行magic_read_entries并修改函数本身以读取库本身的偏移量以便拉入数据,将其视为指向char(char **)的指针,并使用它而不是从文件中读取.由于您知道偏移量对于库数据的读取位置,因此这应该不难.

现在将不再使用函数magic_read_entries,因为它将不再从文件中读取.函数`magichandle_t * magic_init(unsigned flags)’将负责加载条目,你应该没问题.

如果您需要进一步的帮助,请告诉我,

编辑:
我使用了来自sourceforge.net的旧’libmagic’,这就是我所做的:

>将下载的存档提取到我的主目录中,对存档进行解压缩/取消存档将创建一个名为libmagic的文件夹.
>在libmagic中创建一个文件夹并将其命名为Test
>将原始magic.c和minifile.c复制到Test中
>使用突出显示差异的封闭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中.让我知道.

希望这可以帮助,
最好的祝福,
汤姆.

上一篇:C 17是否提供了跨平台方案来记录编译器版本和Fortran等选项?


下一篇:Intellij Idea慢速编译Android应用程序