静态编译libmagic(c/c++文件类型检测)

2024-03-04

感谢那些帮助我的人上一个问题 https://stackoverflow.com/questions/2105816/trying-to-use-include-compile-3rd-party-library-libmagic-c-c-filetype-detecti(链接仅供参考)。

我可以放置文件fileTypeTest.cpp, libmagic.a, and magic在一个目录中,我可以用g++ -lmagic fileTypeTest.cpp fileTypeTest。稍后,我将测试它是否可以在使用 MinGW 编译的 Windows 中运行。

我打算使用libmagic http://sourceforge.net/projects/libmagic/在一个小型 GUI 应用程序中,我想静态编译它以进行分发。我的问题是libmagic似乎需要外部文件,magic。 (我实际上使用的是我自己的缩短和编译版本,magic_short.mgc,但我离题了。)

一个巧妙的解决方案是将文件编码到应用程序中,根据需要创建(和删除)外部文件。我怎样才能避免这种情况?

为了清楚起见添加:

magic是一个文本文件,描述不同文件类型的属性。当要求识别文件时,libmagic搜索通过magic。有一个编译版本,magic.mgc这样效果更快。我的应用程序只需要识别少数文件类型,然后再决定如何处理它们,因此我将使用我自己的文件类型magic_short要创建的文件magic_short.mgc.


这很棘手,我想你可以这样做......顺便说一句,我已经下载了 libmagic 源代码并查看它......

里面有一个函数叫magic_read_entriesminifile.c(这是我从下载的纯香草源来源锻造 http://sourceforge.net/projects/libmagic它正在从外部文件读取。

您可以附加magic文件(位于 /etc 目录中)添加到库代码的末尾,如下所示cat magic >> libmagic.a。在我的系统中,magic是 474443 字节,libmagic.a是 38588 字节。

In the magic.c文件,您需要更改magichandle_t* magic_init(unsigned flags)函数,在函数末尾添加一行magic_read_entries并修改函数本身以在库本身的偏移量处读取以提取数据,将其视为指向 char (char **) 的指针,并使用它而不是从文件中读取。既然您知道要读取的库数据的偏移量,那么这应该不难。

现在功能magic_read_entries将不再使用,因为不再从文件中读取它。函数“magichandle_t* magic_init(unsigned flags)”将负责加载条目,你应该没问题。

如果您需要进一步的帮助,请告诉我,

Edit:我使用了来自 sourceforge.net 的旧“libmagic”,这就是我所做的:

  1. 将下载的存档提取到我的主目录中,解压缩/解压存档将创建一个名为的文件夹libmagic.
  2. 在 libmagic 中创建一个文件夹并调用它Test
  3. 复印原件magic.c and 迷你文件.c into Test
  4. 使用随附的 diff 输出突出显示差异,将其应用到magic.c source.


48a49,51
> #define MAGIC_DATA_OFFSET     0x971C
> #define MAGIC_STAT_LIB_NAME "libmagic.a"
>
125a129,130
>       /* magic_read_entries is obsolete... */
>       magic_read_entries(mh, MAGIC_STAT_LIB_NAME);
251c256,262
<
---
>
>       if (!fseek(fp, MAGIC_DATA_OFFSET, SEEK_SET)){
>               if (ftell(fp) != MAGIC_DATA_OFFSET) return 0;
>       }else{
>               return 0;
>       }
>
  
  • 然后发出make
  • magic 文件(我在 Slackware Linux 12.2 下从 /etc 复制)连接到 libmagic.a 文件,即cat magic >> libmagic.a。 magic 的 SHA 校验和为 (4abf536f2ada050ce945fbba796564342d6c9a61 magic), 这是魔法的确切数据 (-rw-r--r-- 1 root root 474443 2007-06-03 00:52 /etc/file/magic) 在我的系统上找到。
  • 这是差异迷你文件.c源,应用它并通过运行重建迷你文件可执行文件make again.


40c40
<       magic_read_entries(mh,"magic");
---
>       /*magic_read_entries(mh,"magic");*/

  

那么它应该可以工作。如果没有,您将需要通过修改 MAGIC_DATA_OFFSET 来调整库中的偏移量以供读取。如果你愿意,我可以将魔法数据文件粘贴到pastebin中。让我知道。

希望这可以帮助, 此致, 汤姆.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态编译libmagic(c/c++文件类型检测) 的相关文章

  • MVC Core IActionResult 含义

    什么是IActionResult 我尝试查看 MSDN 和其他网站 但需要通用 常见 易于理解的答案 MSDN IActionResult https learn microsoft com en us dotnet api microso
  • 如何在 MFC 中调整对话框大小时移动控件?

    我已经在 MFC 中创建了对话框视图 从下图中可以清楚地看到 如滑块控件和编辑框等 当我调整对话框大小时 这些控件不会移动 在此输入图像描述 https i stack imgur com 7OxAK jpg 我想移动控件以适应对话框 但不
  • C++ 中的单例和抽象基类

    最近我遇到了关于实现 Singleton 但涉及抽象基类的问题 假设我们有这样的类层次结构 class IFoo it s ABC class Foo public IFoo 我们的单例类定义如下 template
  • 我们如何将数据从一个打开的表单传递到另一个打开的表单?

    winform中如何将数据从一个窗体传递到另一个打开的窗体 在 Windows 应用程序中 一个窗体打开另一个窗体 当我在父表单中输入一些数据时 这些数据将立即反映在另一个子表单中 这将如何发生 取决于你想要多花哨 最简单的方法就是直接调用
  • 如何“杀死”Pthread?

    我正在学习 Pthreads 并且想知道杀死这样一个对象的最佳方法是什么 在寻找类似的问题后 我无法找到 明确 的答案 但请随时向我指出任何相关问题 我正在使用一个小型客户端服务器应用程序 其中服务器主线程正在侦听套接字上的客户端连接 每次
  • 使用静态类型代替变量

    当您的项目不使用命名空间时 有什么方法可以告诉编译器使用静态类型而不是变量吗 例如 我有一个名为 User 的类 它具有各种静态和非静态方法 假设调用了其中一个静态方法GetUser 我想称之为User GetUser 方法来自一个方法 该
  • Entity Framework 4.1 RC:Code First EntityTypeConfiguration 继承问题

    我尝试使用通用的 EntityTypeConfiguration 类来配置所有实体的主键 以便每个派生的配置类不会重复自身 我的所有实体都实现一个公共接口 IEntity 它表示每个实体必须有一个 int 类型的 Id 属性 我的配置基类如
  • 如何在 C++ 中对静态缓冲区执行字符串格式化?

    我正在处理一段对性能要求非常高的代码 我需要执行一些格式化的字符串操作 但我试图避免内存分配 甚至是内部库的内存分配 在过去 我会做类似以下的事情 假设是 C 11 constexpr int BUFFER SIZE 200 char bu
  • 正则表达式删除某些字符周围不需要的空格

    我正在尝试从 JavaScript 文件中删除一些不需要的空格 并在将文件发送到客户端之前使用 C 和 Regex 组合文件 我有一个JavascriptHandler处理 js 文件 效果很好 这是我用来 打包 JavaScript 的函
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • 从窗口内容截取屏幕截图(无边框)

    我正在寻找有关如何使用 C 将表单内容保存在位图中的解决方案 我已经尝试过使用 DrawToBitmap 但它捕获了所有带边框的窗口 这就是这段代码的结果 public static Bitmap TakeDialogScreenshot
  • 无法将方法组“Read”转换为非委托类型“bool”

    我正在尝试使用SqlDataReader检查条目是否存在 如果存在则返回ID 否则返回false 当我尝试编译时 出现错误 无法将方法组 Read 转换为非委托类型 bool 我一直在遵循在 VB 中找到的示例 但似乎翻译可能不正确 pri
  • System.diagnostics.process 进程在托管后无法在 IIS 上运行?

    我正在尝试从网络应用程序安装 exe 当我在本地运行应用程序 从 asp 开发服务器 时 它安装正确 但当我托管在 IIS 上时 它不起作用 我在asp net页面的Page load方法上编写了这段代码 想要在客户端计算机上安装Test
  • 如何使用 libpq 获取双精度值?

    The examples http www postgresql org docs 9 3 interactive libpq example htmllibpq 文档中展示了如何通过将整数值转换为主机字节序表示来获取整数值 我很好奇必须做
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • 将小数格式化为两位或整数

    对于 10 我想要 10 而不是 10 00 对于 10 11 我想要 10 11 没有代码可以实现吗 即通过指定格式字符串类似于 0 N2 decimal num 10 11M Console WriteLine num ToString
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN
  • 在类中使用 std::chrono::high_resolution_clock 播种 std::mt19937 的正确方法是什么?

    首先 大家好 这是我在这里提出的第一个问题 所以我希望我没有搞砸 在写这篇文章之前我用谷歌搜索了很多 我对编码 C 很陌生 我正在自学 考虑到有人告诉我 只为任何随机引擎播种一次是一个很好的做法 我在这里可能是错的 什么是正确 最佳 更有效
  • 编译器可以报告未知属性的错误吗?即使有范围?

    在N3291 7 6 1 3 5 属性语法和语义 decl attr grammar 关于如何属性是用我读过的源代码写的 使用一个属性范围令牌是有条件支持的 实现定义的行为 and For an 属性标记本国际标准中未指定 该行为是实现定义
  • 什么时候使用静态库需要头文件?

    如果我在 Linux 中用 C 创建一个静态库并生成 a 文件 我 或其他人 如何使用该库 例如 我的库定义了一个类 我认为仅仅提供 a 文件是不够的 还需要提供头文件 我如何知道 a 文件必须提供哪些头文件 例如 我是否需要提供我的库代码

随机推荐