尝试使用/ include /编译第三方库,libmagic。 C / C ++文件类型检测

时间:2010-01-20 23:20:50

标签: c++ c include file-type

在寻找一种方法来检测文件流的文件类型后,我发现Unix file command使用了libmagic而我正在尝试自己使用该库,但是我无法将其用于工作。我很少在我自己中集成第三方代码,所以这可能也是我问题的重要部分。

为什么:

我这样做是因为我有一个便携式gui图像查看应用程序,需要从给定的文件名中检测存档文件类型(rar,zip,more?),然后检测内部的图像文件类型。我希望我可以在Windows和Linux(以及Mac)上使用libmagic,所以如果不是这样,请立即停止使用b / c我需要找到别的东西。

尝试:

我找到了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

的工作原理。我不得不去synaptic并安装libmagic-dev。在Windows的MingW上编译我的应用程序时,我将不得不进行测试以查看是否可以将/usr/lib/libmagic.a复制到我的源目录中,但我认为这将是以后的另一个问题。

3 个答案:

答案 0 :(得分:1)

__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 fileTestType
g++ -L/usr/lib -lmagic fileTestType.cpp -o fileTestType

修改 感谢 Alok 指出此处的错误...

如果您不确定libmagic所在的位置,请在/ usr / local / lib和/ usr / local / include中查找 - 这取决于您的安装。

查看此内容以查找预定义的宏here

希望这有帮助, 最好的祝福, 汤姆。

答案 1 :(得分:0)

我不知道为什么你认为上述“显然”不起作用。有关详细信息,请参阅How to mix C and C++中的C++ FAQ

看起来magic.h有正确的extern "C" { }个附件。因此,使用g++编译代码应该可以很好地工作。您可以在#include <magic.h>文件中.cpp,并使用所有libmagic函数。

  • 你有没有特别的错误?
  • 我没有检查过你对libmagic函数的使用。
  • 您需要与libmagic链接。您的g++命令需要-lmagic
  • 由于magic.h最有可能出现在标准位置,因此您应该使用#include <magic.h>

告诉我们您的错误是什么,以获得更具体的帮助。

答案 2 :(得分:0)

文件系统中的magic.h在哪里?预处理器是否找到了它?如果没有,请使用-I<path>