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

在寻找一种方法来检测文件流的文件类型之后,我发现Unix 文件命令使用了libmagic,我试图自己使用这个库,但我无法让它工作。 我很少在我自己中集成第三方代码,所以这可能也是我问题的重要部分。

为什么:

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

尝试:

我发现有人做了类似的事情 ,但我不能按照他们正在做的事情,而且我不知道如何编译/运行任何东西来开始搞乱。

我的第一直觉是做以下事情:

// fileTypeTest.cpp, placed in file-5.03/src/ (source from link above) #include  #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  #include  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复制到我的源目录中,但是我想这将是另一个问题。

__FILE__是一个保留的预处理符号宏,用于调试/记录。 以此为例:

 //此文件名为test.c
 char * p = NULL;
 if(!(p = malloc((1 * sizeof(char)+ 1)))){
    printf(“文件中的错误:%s @ line%d \ n \ tMalloc failed \ n”,__ FILE __,_ _ _ _ ____);
   出口(-1);
 }

如果对malloc的调用失败,您将看到上面示例中的输出,如下所示:

文件错误:test.c @第23行
        Malloc失败了

请注意代码如何获取原始源代码。 上面的例子说明了这个用法。

我认为你的代码应该是这样的:

 // fileTypeTest.cpp,放在file-5.03 / src /中(来自上面的链接)
 #include 
 #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(“魔术输出:'%s'\ n”,magic_file(myt,argv [1]));
      magic_close(MYT);
   }
  返回0;
 }

上面的代码检查是否有传递给该程序的参数,参数是文件名,即argv[0]指向可执行文件名(编译后的二进制文件), argv[1]指向chars数组(一个字符串),表示有问题的文件名。

要编译它:

 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中查找 – 这取决于您的安装。

请在此处查找预定义的宏。

希望这会有所帮助,最好的问候,汤姆。

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

我不知道为什么你认为上述“显然”不起作用。 有关详细信息,请参阅如何在C ++ FAQ中 混合使用C和C ++

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

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

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