c++ - 尝试使用/包含/编译第 3 方库 libmagic。 C/C++文件类型检测

标签 c++ c include file-type

在寻找检测文件流文件类型的方法后,我发现 Unix file command使用 libmagic 并且我正在尝试自己使用该库,但我无法让它工作。我很少在自己的代码中集成第 3 方代码,所以这可能也是我的问题的很大一部分。

原因:

我这样做是因为我有一个可移植 gui 图像查看应用程序,它需要从给定的文件名中检测存档文件类型(rar、zip 等?),然后检测其中的图像文件类型。我希望我可以在 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 复制到我的源目录中,但我想那将是稍后的另一个问题。

最佳答案

__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

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

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

// 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 .

希望对您有所帮助, 最好的祝福, 汤姆。

关于c++ - 尝试使用/包含/编译第 3 方库 libmagic。 C/C++文件类型检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2105816/

相关文章:

c++ - Windows 上的 std::map::operator[] 违规访问内存

c - C中成功创建线程返回的错误状态

PHP 严格标准 : Creating default object from empty value

c - 用于将 rtspsrc 的名称元素与音频和视频队列链接的 Gstreamer 应用程序

php mysqli_query 没有结果

php - 如何获取包含内容作为字符串?

c++ - 关于 c/c++ 中 fftw 的内存引用

c++ - 如何将项目依赖项/引用从一个项目继承到 Visual Studio 中的依赖项目

C++ 在 Os X 上捕获所有异常失败

c - 在 C 程序中找不到终端命令 "convert"