Rustbindgen вызывает ошибку «недействительный идентификатор» при сборке
Кто-нибудь знает, как начать отладку этой проблемы с отступами привязки Rust?
stderr thread 'main' panicked at '"vpx_codec_ctx_union_(unnamed_at_/usr/include/vpx/_/vpx_codec_h_206_3)" is not a valid Ident', /home/ignis/.cargo/registry/src/github.com-1ecc6299db9ec823/proc-macro2-1.0.59/src/fallback.rs:811:9
Это ссылка на эту часть заголовка libvpx:
/*!\brief Codec context structure
*
* All codecs \ref MUST support this context structure fully. In general,
* this data should be considered private to the codec algorithm, and
* not be manipulated or examined by the calling application. Applications
* may reference the 'name' member to get a printable description of the
* algorithm.
*/
typedef struct vpx_codec_ctx {
const char *name; /**< Printable interface name */
vpx_codec_iface_t *iface; /**< Interface pointers */
vpx_codec_err_t err; /**< Last returned error */
const char *err_detail; /**< Detailed info, if available */
vpx_codec_flags_t init_flags; /**< Flags passed at init time */
union {
/**< Decoder Configuration Pointer */
const struct vpx_codec_dec_cfg *dec;
/**< Encoder Configuration Pointer */
const struct vpx_codec_enc_cfg *enc;
const void *raw;
} config; /**< Configuration pointer aliasing union */
vpx_codec_priv_t *priv; /**< Algorithm private storage */
} vpx_codec_ctx_t;
Я вижу много ответов в Интернете, в которых говорится о занесении этих типов в черный список, но я не могу внести это в черный список, поскольку необходим тип контекста. Похоже, тип объединения вызывает проблемы...
Обновление: найдена соответствующая часть документации vpx-sys: https://docs.rs/env-libvpx-sys/5.1.2/vpx_sys .
Похоже, автор библиотеки смог сгенерировать привязки...
1 ответ
Это тревожный код:
pub(crate) fn is_ident_start(c: char) -> bool {
c == '_' || unicode_ident::is_xid_start(c)
}
pub(crate) fn is_ident_continue(c: char) -> bool {
unicode_ident::is_xid_continue(c)
}
fn validate_ident(string: &str, raw: bool) {
if string.is_empty() {
panic!("Ident is not allowed to be empty; use Option<Ident>");
}
if string.bytes().all(|digit| digit >= b'0' && digit <= b'9') {
panic!("Ident cannot be a number; use Literal instead");
}
fn ident_ok(string: &str) -> bool {
let mut chars = string.chars();
let first = chars.next().unwrap();
if !is_ident_start(first) {
return false;
}
for ch in chars {
if !is_ident_continue(ch) {
return false;
}
}
true
}
if !ident_ok(string) {
panic!("{:?} is not a valid Ident", string);
}
if raw {
match string {
"_" | "super" | "self" | "Self" | "crate" => {
panic!("`r#{}` cannot be a raw identifier", string);
}
_ => {}
}
}
}
Это просто проверка наличия в идентификаторах допустимых символов. В этом случае,(
(и я подозреваю/
) являются недопустимыми символами.
Так почему же это происходит? Взгляните на сообщение об ошибке:"vpx_codec_ctx_union_(unnamed_at_/usr/include/vpx/_/vpx_codec_h_206_3)" is not a valid Ident
Все в(unamed...)
часть не должна была дойти до этой стадии. Выполняя поиск, мы находим здесь проблему с ржавчиной-bindgen, которая ссылается на коммит libclang, вызвавший изменение .
В частности, этот коммит был для Clang 16. Поэтому либо понизьте Clang до версии до 16, либо обновите свой контейнер привязки до версии 0.62.0 или выше (именно тогда было применено исправление).