Comment corriger le crate Rust clang : erreur de recherche de symbole : symbole non défini : LLVMInitializeAArch64TargetInfo
Problème
Lorsque vous essayez d’exécuter un exécutable Rust utilisant le crate clang, vous voyez un message d’erreur tel que
clang_symbol_lookup_error.txt
$ cargo run clangtest.cpp
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/asx clangtest.cpp`
target/debug/clangtest: symbol lookup error: /lib/x86_64-linux-gnu/libclang-19.so.19: undefined symbol: LLVMInitializeAArch64TargetInfo, version LLVM_19.1Solution
Cette erreur se produit car Cargo lie la mauvaise libLLVM. Une cause fréquente est que vous avez installé rocm (la pile de calcul d’AMD) qui est fourni avec sa propre libLLVM incompatible avec celle utilisée par libclang.
Pour corriger cela, ajoutez un fichier build.rs
build.rs
use std::{env, path::{Path, PathBuf}};
fn main() {
// Permet la surcharge via une variable d'environnement pour plus de flexibilité.
// Exemple : LLVM19_LIB_DIR=/custom/llvm19/lib cargo build
let llvm_dir = env::var("LLVM19_LIB_DIR").unwrap_or_else(|_| "/usr/lib/llvm-19/lib".to_string());
let llvm_so_candidates = [
"libLLVM.so", // soname symlink
"libLLVM-19.so", // alternative naming pattern
"libLLVM.so.19", // versioned pattern
"libLLVM.so.19.1", // specific minor version
];
let dir_path = Path::new(&llvm_dir);
if !dir_path.is_dir() {
panic!("LLVM directory '{llvm_dir}' does not exist. Set LLVM19_LIB_DIR to the correct path.");
}
// Tente de localiser un fichier de bibliothèque réellement existant que nous pouvons passer explicitement à l'éditeur de liens pour éviter d'en récupérer un depuis un autre emplacement (par ex. /opt/amdgpu)
let chosen_lib: Option<PathBuf> = llvm_so_candidates.iter()
.map(|name| dir_path.join(name))
.find(|p| p.exists());
if let Some(lib_path) = chosen_lib {
let lib_dir = lib_path.parent().unwrap();
// S'assure que notre répertoire souhaité est recherché en premier
println!("cargo:rustc-link-search=native={}", lib_dir.display());
// Nous émettons toujours le link-lib générique pour satisfaire les symboles éventuellement répartis sur plusieurs composants.
println!("cargo:rustc-link-lib=dylib=LLVM");
// Force la bibliothèque exacte en passant son chemin absolu comme argument de l'éditeur de liens (placé après les objets afin qu'il soit utilisé pour la résolution)
println!("cargo:rustc-link-arg={}", lib_path.display());
// Ajoute un rpath afin que le chargeur à l'exécution préfère également ce répertoire.
println!("cargo:rustc-link-arg=-Wl,-rpath,{}", lib_dir.display());
// Optionnellement, préfère notre chemin en l'ajoutant également au RUNPATH (GNU ld traite rpath/runpath subtilement ; utiliser rpath ici suffit pour la plupart des systèmes)
println!("cargo:rerun-if-env-changed=LLVM19_LIB_DIR");
} else {
panic!("Could not locate any libLLVM* candidate in {llvm_dir}. Candidates tried: {:?}", llvm_so_candidates);
}
}Vous devez également configurer Cargo.toml pour utiliser ce script de build :
Cargo.toml
[package]
build = "build.rs"Check out similar posts by category:
Rust
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow