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.
这很棘手,我想你可以这样做......顺便说一句,我已经下载了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',这就是我所做的:
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;
> }
>
cat magic >> libmagic.a.魔法的SHA校验和是(4abf536f2ada050ce945fbba796564342d6c9a61 magic),这里是魔法的确切数据(-rw-r - r-- 1 root root 474443 2007-06-03 00:52/etc/file/magic)系统.40c40 < magic_read_entries(mh,"magic"); --- > /*magic_read_entries(mh,"magic");*/
它应该工作.如果没有,您将需要通过修改MAGIC_DATA_OFFSET来调整库中的偏移量以进行读取.如果你愿意,我可以将魔术数据文件粘贴到pastebin中.让我知道.
希望这会有所帮助,最好的问候,汤姆.
| 归档时间: |
|
| 查看次数: |
5122 次 |
| 最近记录: |