You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jextract生成YARA Java绑定遇'intmax_t'未知类型错误求助

问题描述

我想用jextract工具为/usr/include/yara.h头文件生成Java绑定——该工具基于clang C API解析原生库头文件,依托Foreign Function & Memory API生成绑定,源自Panama项目。

我能正常构建并测试jextract项目,但执行以下命令时遇到intmax_t类型未定义的错误:

build/jextract/bin/jextract --source --output java-yara --target-package com.virustotal.yara /usr/include/yara.h

错误输出:

/usr/include/inttypes.h:290:8: error: unknown type name 'intmax_t'

我检查了/usr/include/inttypes.h,它已经正确引入了<stdint.h>:

/*
 *  ISO C99: 7.8 Format conversion of integer types <inttypes.h>
 */

#ifndef _INTTYPES_H
#define _INTTYPES_H 1

#include <features.h>
/* Get the type definitions.  */
#include <stdint.h>

我的fork仓库里有Taskfile,可通过task build和task yara-extract复现错误。我尝试添加了以下包含路径,但问题未解决:

-I /usr/include
-I /usr/include/yara
-I /usr/lib/llvm-15/lib/clang/15.0.6/include

另外,用clang能正常解析yara.h并找到intmax_t的引用:

clang-15 -fsyntax-only -Xclang -ast-dump /usr/include/yara.h | grep intmax_t

返回结果:

|-TypedefDecl 0x559220f80400 <line:72:1, col:18> col:18 referenced __intmax_t 'long'
|-TypedefDecl 0x559220f80470 <line:73:1, col:27> col:27 referenced __uintmax_t 'unsigned long'
|-TypedefDecl 0x55922102e2f0 <line:101:1, col:21> col:21 referenced intmax_t '__intmax_t':'long'
| `-TypedefType 0x55922102e2c0 '__intmax_t' sugar
|   |-Typedef 0x559220f80400 '__intmax_t'
|-TypedefDecl 0x55922102e380 <line:102:1, col:22> col:22 referenced uintmax_t '__uintmax_t':'unsigned long'
| `-TypedefType 0x55922102e350 '__uintmax_t' sugar
|   |-Typedef 0x559220f80470 '__uintmax_t'
|-FunctionDecl 0x55922102e788 <line:290:1, col:74> col:17 imaxabs 'intmax_t (intmax_t)' extern
| |-ParmVarDecl 0x55922102e6c0 <col:26, col:35> col:35 __n 'intmax_t':'long'
|-FunctionDecl 0x55922102ea68 <line:293:1, line:294:41> line:293:18 imaxdiv 'imaxdiv_t (intmax_t, intmax_t)' extern
| |-ParmVarDecl 0x55922102e8e0 <col:27, col:36> col:36 __numer 'intmax_t':'long'
| |-ParmVarDecl 0x55922102e958 <col:45, col:54> col:54 __denom 'intmax_t':'long'
|-FunctionDecl 0x559221040998 <line:297:1, /usr/include/x86_64-linux-gnu/sys/cdefs.h:79:54> /usr/include/inttypes.h:297:17 strtoimax 'intmax_t (const char *restrict, char **restrict, int)' extern
|-FunctionDecl 0x559221040cc8 </usr/include/inttypes.h:301:1, /usr/include/x86_64-linux-gnu/sys/cdefs.h:79:54> /usr/include/inttypes.h:301:18 strtoumax 'uintmax_t (const char *restrict, char **restrict, int)' extern
|-FunctionDecl 0x5592210410e8 </usr/include/inttypes.h:305:1, /usr/include/x86_64-linux-gnu/sys/cdefs.h:79:54> /usr/include/inttypes.h:305:17 wcstoimax 'intmax_t (const __gwchar_t *restrict, __gwchar_t **restrict, int)' extern
|-FunctionDecl 0x559221041428 </usr/include/inttypes.h:310:1, /usr/include/x86_64-linux-gnu/sys/cdefs.h:79:54> /usr/include/inttypes.h:310:18 wcstoumax 'uintmax_t (const __gwchar_t *restrict, __gwchar_t **restrict, int)' extern

环境信息

  • 操作系统:Ubuntu 22.04.1 LTS,Kernel 5.15.0-52-generic,x86-64架构
  • Java版本:openjdk 19 2022-09-20
  • Gradle版本:7.6
  • LLVM版本:15.0.6
  • Clang版本:Ubuntu clang 15.0.6

解决方法

1. 指定C99标准编译

intmax_t是C99标准引入的类型,jextract默认可能未启用C99,给clang加上-std=c99参数(--是jextract和clang参数的分隔符):

build/jextract/bin/jextract --source --output java-yara --target-package com.virustotal.yara -- -std=c99 /usr/include/yara.h

2. 显式定义C99版本宏

如果指定C99无效,尝试显式定义C99版本宏,强制<stdint.h>导出intmax_t:

build/jextract/bin/jextract --source --output java-yara --target-package com.virustotal.yara -- -D__STDC_VERSION__=199901L /usr/include/yara.h

3. 调整include路径顺序

确保clang自带的系统头文件路径优先,把LLVM的clang include路径放在最前面:

build/jextract/bin/jextract --source --output java-yara --target-package com.virustotal.yara -- -I /usr/lib/llvm-15/lib/clang/15.0.6/include -I /usr/include -I /usr/include/yara /usr/include/yara.h

4. 确认jextract的clang版本匹配

检查jextract编译时链接的clang版本是否为15.0.6,避免版本不匹配导致的解析差异。可以重新构建jextract时指定LLVM路径:

./gradlew -Pllvm.install.dir=/usr/lib/llvm-15 build

内容的提问来源于stack exchange,提问作者1Z10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:15:58