尝试使用/包含/编译第三方库libmagic. C/C++文件类型检测
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了尝试使用/包含/编译第三方库libmagic. C/C++文件类型检测,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2867字,纯文字阅读大概需要5分钟。
内容图文
![尝试使用/包含/编译第三方库libmagic. C/C++文件类型检测](/upload/InfoBanner/zyjiaocheng/694/5281d7c3de8540dcb0478f33b05e9d63.jpg)
在寻找一种检测文件流文件类型的方法之后,我发现Unix file command使用libmagic,并且我试图自己使用该库,但无法使其正常工作.我很少自己集成第三方代码,因此这也可能是我问题的很大一部分.
为什么:
我这样做是因为我有一个便携式gui图像查看应用程序,该应用程序需要从给定的文件名中检测存档文件类型(rar,zip,更多?),然后检测其中的图像文件类型.我希望可以在Windows和Linux(以及Mac)上使用libmagic,因此,如果不是这种情况,请立即阻止我,我需要找到其他东西.
尝试:
我找到了somebody doing something similar,但是我无法跟踪他们在做什么,而且我也不知道如何编译/运行任何东西来开始搞乱.
我的第一个直觉是做类似的事情:
// fileTypeTest.cpp, placed in file-5.03/src/ (source from link above)
#include <stdio.h>
#include "magic.h"
int main() {
magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME);
magic_load(myt,NULL);
printf("magic output: '%s'\n",magic_file(myt,__FILE__));
magic_close(myt);
return 0;
}
然后用类似的东西编译:
$gcc magic.c -o magic.o
$g++ fileTypeTest.cpp -o fileTypeTest magic.o
哪个(显然?)不起作用.我什至不知道从哪里开始寻找什么问题,或者这是否是解决我最初的问题的正确方向.
编辑:现在我有
#include <stdio.h>
#include <magic.h>
int main(int argc, char* argv[]) {
if (argc != 2) {
printf("bad arguments");
return 0;
}
magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME);
magic_load(myt,NULL);
printf("magic output: '%s'\n", magic_file(myt, argv[1]));
magic_close(myt);
return 0;
}
编译:
$g++ -L/usr/lib -libmagic fileTypeTest.cpp -o fileTypeTest
作品.我不得不去突触并安装libmagic-dev.在Windows的MingW上编译我的应用程序时,我必须进行测试以查看是否可以将/usr/lib/libmagic.a复制到源目录中,但是我想这将是另一个问题.
解决方法:
__FILE__是保留的预处理符号宏,用于调试/记录.考虑以下示例:
// This file is called test.c char *p = NULL; if (!(p = malloc((1 * sizeof(char) + 1)))){ printf("Error in file: %s @ line %d\n\tMalloc failed\n", __FILE__, __LINE__); exit(-1); }
如果对malloc的调用失败,您将在上面的示例中看到如下输出:
Error in file: test.c @ line 23 Malloc failed
请注意,代码是如何获取原始源代码的.上面的示例说明了此用法.
我认为您的代码应如下所示:
// fileTypeTest.cpp, placed in file-5.03/src/ (source from link above) #include <stdio.h> #include "magic.h" int main(int argc, char **argv) { if (argc > 1){ magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME); magic_load(myt,NULL); printf("magic output: '%s'\n",magic_file(myt,argv[1])); magic_close(myt); } return 0; }
上面的代码检查是否有参数传递给该程序,并且该参数将是文件名,即argv [0]指向可执行文件名称(编译后的二进制文件),argv [1]指向字符数组(字符串)指示相关文件名.
要编译它:
g++ -I/usr/include -L/usr/lib/libmagic.so fileTestType.cpp -o fileTestTypeg++ -L/usr/lib -lmagic fileTestType.cpp -o fileTestType
编辑:感谢Alok在这里指出错误…
如果不确定libmagic的位置,请在/usr/local/lib和/usr/local/include中查找-这取决于您的安装.
看到此内容以查找预定义的宏here.
希望这可以帮助,
最好的祝福,
汤姆.
内容总结
以上是互联网集市为您收集整理的尝试使用/包含/编译第三方库libmagic. C/C++文件类型检测全部内容,希望文章能够帮你解决尝试使用/包含/编译第三方库libmagic. C/C++文件类型检测所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。