使用g++编译LLVM程序时遇llvm::Module::dump()未定义引用错误
问题描述
我编译以下C++程序:
#include "llvm/Analysis/LoopInfo.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/Module.h" #include "llvm/IRReader/IRReader.h" #include "llvm/Support/SourceMgr.h" #include <cstdlib> #include <string> using namespace llvm; int main(int argc, char **argv) { std::string target = "'./self_tests/src_huawei/alg5.cpp'"; std::string cml = "clang -emit-llvm -c " + target + " -o 'result.bc' -O3 -fno-vectorize -fno-slp-vectorize -fno-unroll-loops"; int result = system(cml.c_str()); LLVMContext CurrContext; SMDiagnostic Err; std::unique_ptr<Module> mod = parseIRFile(llvm::StringRef("result.bc"), Err, CurrContext); mod->dump(); return 0; }
使用g++编译时报告错误:undefined reference to 'llvm::Module::dump() const'。编译命令如下:
g++ -m64 -g -lLLVM -lLLVMSupport -lLLVMDemangle -lLLVMDemangle ./src/test.cpp -o test.out
我已链接所有名称包含llvm的库,但问题仍未解决。
解决方案
1. 使用llvm-config自动生成编译链接参数
LLVM自带的llvm-config工具可以直接输出正确的编译和链接参数,避免手动指定库的遗漏或顺序错误,替换你的编译命令为:
g++ -m64 -g ./src/test.cpp -o test.out $(llvm-config --cxxflags --ldflags --system-libs --libs core irreader support)
参数说明:
--cxxflags:获取LLVM的编译选项(头文件路径、宏定义等)--libs core irreader support:指定需要链接的核心库、IR读取库和支持库,dump()方法的实现包含在这些库中--ldflags --system-libs:补充链接器选项和系统依赖库
2. 修正手动链接的顺序和库列表
如果坚持手动指定库,需要注意两个关键点:
- 源文件必须放在库参数前面:链接器会按顺序解析符号,先处理源文件中的未定义符号,再从后续库中查找
- 指定具体的LLVM子库而非笼统的
-lLLVM:调整命令为:
g++ -m64 -g ./src/test.cpp -o test.out -lLLVMCore -lLLVMIRReader -lLLVMSupport -lLLVMDemangle
3. 替换调试方法为正式输出接口
dump()是LLVM的调试专用方法,依赖特定的编译组件。如果仍无法解决,可以替换为更通用的print()方法,它属于正式接口,兼容性更好:
将代码中的mod->dump();修改为:
mod->print(llvm::errs(), nullptr);
4. 确认LLVM编译完整性
确保你使用的LLVM是完整编译的版本,包含了核心调试组件(若要继续使用dump());如果LLVM是静态库,必须链接所有依赖的静态子库,此时用llvm-config生成参数是最稳妥的方式。
内容的提问来源于stack exchange,提问作者Shore
相关产品推荐
相关产品推荐

