尝试使用/包括/编译第三方库,libmagic。 C/C ++ Filetype检测
题
在寻找一种检测文件流的文件类型的方法之后,我发现了UNIX 文件命令 使用libmagic,我正在尝试自己使用图书馆,但我无法正常工作。我很少会自己整合第三方代码,因此这可能也是我问题的重要组成部分。
为什么:
我之所以这样做,是因为我有一个便携式GUI图像查看应用程序,该应用需要从给定的文件名中检测到存档文件类型(RAR,zip,更多?),然后在内部检测图像文件类型。我希望我可以将libmagic用于Windows和Linux(和Mac),因此,如果不是这种情况,请立即停止B/C,我需要找到其他东西。
试图:
我发现 有人做类似的事情, ,但是我无法遵循他们的工作,也不知道如何编译/运行任何东西开始搞砸。
我的第一个本能是做类似的事情:
// 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/包括-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中查找它,这取决于您的安装。
看到这一点以找到预定义的宏 这里.
希望这对汤姆有帮助,汤姆。
其他提示
哪里 magic.h
在文件系统中?预处理器是否找到它?如果没有,请使用 -I<path>
.
我不知道为什么您认为上面的“显然”不起作用。看 如何混合C和C ++ 在里面 C ++常见问题解答 有关详细信息。
好像 magic.h
有适当的 extern "C" {
}
外壳。因此,将您的代码编译 g++
应该很好地工作。你可以 #include <magic.h>
在你的 .cpp
文件,并使用所有libmagic功能。
- 您有一个特殊的错误吗?
- 我尚未检查您对Libmagic功能的使用。
- 您需要与libmagic链接。您的
g++
命令需要-lmagic
. - 自从
magic.h
最有可能在标准的地方,您应该使用#include <magic.h>
.
告诉我们您的错误是什么,以获得更具体的帮助。