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

基于LLVM新Pass管理器的Hello World Pass编译动态库报错求助

问题根源与解决办法

咱们先从编译错误的核心说起——你在passHook函数里犯了一个很容易忽略的小错误:

FPM.addPass(passHook);

你这里试图把**passHook这个函数本身**加到函数 Pass 管理器里,但 LLVM 新 Pass 管理器的addPass方法,要求传入的是一个符合 Pass 接口的类实例(也就是你定义的PassTest,它继承了PassInfoMixin),而不是一个普通函数。

编译器在处理这段代码时,会把函数类型当成 Pass 类型去实例化模板,然后尝试调用这个"Pass"的run和name方法——但函数本身不是结构体或类,根本没有这些成员,这就是你看到那两条报错信息的直接原因。

第一步:修正代码错误

把passHook里的错误代码改成添加PassTest的实例就好:

bool passHook(StringRef Name, FunctionPassManager &FPM, ArrayRef<PassBuilder::PipelineElement>) {
  if (Name != "pass_test") return false;
  // 替换成PassTest的实例,而不是passHook函数
  FPM.addPass(PassTest());
  return true;
}

第二步:解决编译链接问题

你之前用clang直接编译的命令缺少必要的链接选项,仅包含头文件是不够的,必须链接 LLVM 的相关库。对于通过apt安装的 LLVM 13,你可以试试这个编译命令(库名可能需要根据你的系统微调):

clang -shared -fPIC -I/usr/include/llvm-13 -I/usr/include/llvm-c-13 -L/usr/lib/llvm-13/lib -lllvmPasses -lllvmCore -o libpass_test.so pass_test.cpp

当然更推荐用 CMake 来构建,它能自动处理 LLVM 的依赖和链接逻辑,给你一个简单的 CMakeLists.txt 示例:

cmake_minimum_required(VERSION 3.13)
project(pass_test)

find_package(LLVM 13 REQUIRED CONFIG)

include_directories(${LLVM_INCLUDE_DIRS})
add_definitions(${LLVM_DEFINITIONS})

add_library(pass_test SHARED pass_test.cpp)
target_link_libraries(pass_test PRIVATE ${LLVM_LIBRARIES})

修正完成后,你就可以用opt加载这个插件测试了,比如:

opt -load-pass-plugin=./libpass_test.so -passes="pass_test" -disable-output test.ll

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:52:45