感谢帮助我使用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中.让我知道.
希望这可以帮助,
最好的祝福,
汤姆.