发帖原因
今天刚装完了LLVM之后,当我想编写c++的代码的时候,才发现我环境都没配好,肯定都是报红的。因此经过我的一阵摸索,我终于找到了配置的办法,并写下了此文章来看看能不能帮助大家。
个人配置环境:
- Visual Studio
- Windows 11
- LLVM 【20.0.0git】
1. 获取配置信息
首先确保你的LLVM的编译和环境变量配置都是没问题的!!!
在llvm编译好的bin的目录里,有一个叫 llvm-config
的程序
这个程序就可以来帮助我们完成环境部署。我们在cmd先输入 llvm-config --help
来输出它的帮助文本:
usage: llvm-config <OPTION>... [<COMPONENT>...]
Get various configuration information needed to compile programs which use
LLVM. Typically called from 'configure' scripts. Examples:
llvm-config --cxxflags
llvm-config --ldflags
llvm-config --libs engine bcreader scalaropts
Options:
--assertion-mode Print assertion mode of LLVM tree (ON or OFF).
--bindir Directory containing LLVM executables.
--build-mode Print build mode of LLVM tree (e.g. Debug or Release).
--build-system Print the build system used to build LLVM (e.g. `cmake` or `gn`).
--cflags C compiler flags for files that include LLVM headers.
--cmakedir Directory containing LLVM CMake modules.
--components List of all possible components.
--cppflags C preprocessor flags for files that include LLVM headers.
--cxxflags C++ compiler flags for files that include LLVM headers.
--has-rtti Print whether or not LLVM was built with rtti (YES or NO).
--help Print a summary of llvm-config arguments.
--host-target Target triple used to configure LLVM.
--ignore-libllvm Ignore libLLVM and link component libraries instead.
--includedir Directory containing LLVM headers.
--ldflags Print Linker flags.
--libdir Directory containing LLVM libraries.
--libfiles Fully qualified library filenames for makefile depends.
--libnames Bare library names for in-tree builds.
--libs Libraries needed to link against LLVM components.
--link-shared Link the components as shared libraries.
--link-static Link the component libraries statically.
--obj-root Print the object root used to build LLVM.
--prefix Print the installation prefix.
--shared-mode Print how the provided components can be collectively linked (`shared` or `static`).
--system-libs System Libraries needed to link against LLVM components.
--targets-built List of all targets currently built.
--version Print LLVM version.
Typical components:
all All LLVM libraries (default).
engine Either a native JIT or a bitcode interpreter.
中文翻译(由 ChatGPT 进行翻译):
使用方法:llvm-config <选项>... [<组件>...]
获取编译使用 LLVM 的程序所需的各种配置信息。通常在 'configure' 脚本中调用。例如:
llvm-config --cxxflags
llvm-config --ldflags
llvm-config --libs engine bcreader scalaropts
选项说明:
--assertion-mode 显示 LLVM 树的断言模式(ON 或 OFF)
--bindir 包含 LLVM 可执行文件的目录。
--build-mode 显示 LLVM 树的构建模式(例如 Debug 或 Release)。
--build-system 显示用于构建 LLVM 的构建系统(例如 cmake 或 gn)。
--cflags 包含 LLVM 头文件的 C 编译器标志。
--cmakedir 包含 LLVM CMake 模块的目录。
--components 列出所有可用的组件。
--cppflags 包含 LLVM 头文件的 C 预处理器标志。
--cxxflags 包含 LLVM 头文件的 C++ 编译器标志。
--has-rtti 显示 LLVM 是否启用了 RTTI(YES 或 NO)。
--help 显示 llvm-config 参数的摘要。
--host-target 用于配置 LLVM 的目标三元组。
--ignore-libllvm 忽略 libLLVM,并改为链接组件库。
--includedir 包含 LLVM 头文件的目录。
--ldflags 显示链接器标志。
--libdir 包含 LLVM 库的目录。
--libfiles 用于 Makefile 依赖的完整库文件路径。
--libnames 用于树内构建的纯库名称。
--libs 链接 LLVM 组件所需的库。
--link-shared 将组件链接为共享库。
--link-static 将组件库静态链接。
--obj-root 显示用于构建 LLVM 的对象根目录。
--prefix 显示安装前缀路径。
--shared-mode 显示如何以整体方式链接组件(shared 或 static)。
--system-libs 链接 LLVM 组件所需的系统库。
--targets-built 列出当前已构建的所有目标。
--version 显示 LLVM 版本。
常见组件:
all 所有 LLVM 库(默认)。
engine 原生 JIT 或位码解释器。
我们依次执行下列命令,并把得到的结果随便记录到什么地方都行(比如 notepad记事本,甚至微信文件传输助手也行)
llvm-config --cxxflags
llvm-config --ldflags
llvm-config --libs
llvm-config --system-libs
2. 根据信息进行配置
根据上边得到的信息,我们需要配置两个头文件包含路径
- D:\llvm-project\llvm\include
- D:\llvm-project\build\include
接着,我们看到上边还有个-std:c++17
,这说明我们要在vs里启用c++17标准
接下来还要配置库目录,根据上边的信息,我们还要再包含一个库目录路径:
D:\llvm-project\build\Release\lib
最后,我们要配置依赖项,依赖项有llvm自己的,还有系统的
D:\llvm-project\build\Release\lib\LLVMWindowsManifest.lib
D:\llvm-project\build\Release\lib\LLVMXRay.lib
D:\llvm-project\build\Release\lib\LLVMLibDriver.lib
D:\llvm-project\build\Release\lib\LLVMDlltoolDriver.lib
D:\llvm-project\build\Release\lib\LLVMTelemetry.lib
D:\llvm-project\build\Release\lib\LLVMTextAPIBinaryReader.lib
D:\llvm-project\build\Release\lib\LLVMCoverage.lib
D:\llvm-project\build\Release\lib\LLVMLineEditor.lib
D:\llvm-project\build\Release\lib\LLVMX86TargetMCA.lib
D:\llvm-project\build\Release\lib\LLVMX86Disassembler.lib
D:\llvm-project\build\Release\lib\LLVMX86AsmParser.lib
D:\llvm-project\build\Release\lib\LLVMX86CodeGen.lib
D:\llvm-project\build\Release\lib\LLVMX86Desc.lib
D:\llvm-project\build\Release\lib\LLVMX86Info.lib
D:\llvm-project\build\Release\lib\LLVMOrcDebugging.lib
D:\llvm-project\build\Release\lib\LLVMOrcJIT.lib
D:\llvm-project\build\Release\lib\LLVMWindowsDriver.lib
D:\llvm-project\build\Release\lib\LLVMMCJIT.lib
D:\llvm-project\build\Release\lib\LLVMJITLink.lib
D:\llvm-project\build\Release\lib\LLVMInterpreter.lib
D:\llvm-project\build\Release\lib\LLVMExecutionEngine.lib
D:\llvm-project\build\Release\lib\LLVMRuntimeDyld.lib
D:\llvm-project\build\Release\lib\LLVMOrcTargetProcess.lib
D:\llvm-project\build\Release\lib\LLVMOrcShared.lib
D:\llvm-project\build\Release\lib\LLVMDWP.lib
D:\llvm-project\build\Release\lib\LLVMDebugInfoLogicalView.lib
D:\llvm-project\build\Release\lib\LLVMDebugInfoGSYM.lib
D:\llvm-project\build\Release\lib\LLVMOption.lib
D:\llvm-project\build\Release\lib\LLVMObjectYAML.lib
D:\llvm-project\build\Release\lib\LLVMObjCopy.lib
D:\llvm-project\build\Release\lib\LLVMMCA.lib
D:\llvm-project\build\Release\lib\LLVMMCDisassembler.lib
D:\llvm-project\build\Release\lib\LLVMLTO.lib
D:\llvm-project\build\Release\lib\LLVMPasses.lib
D:\llvm-project\build\Release\lib\LLVMHipStdPar.lib
D:\llvm-project\build\Release\lib\LLVMCFGuard.lib
D:\llvm-project\build\Release\lib\LLVMCoroutines.lib
D:\llvm-project\build\Release\lib\LLVMipo.lib
D:\llvm-project\build\Release\lib\LLVMVectorize.lib
D:\llvm-project\build\Release\lib\LLVMSandboxIR.lib
D:\llvm-project\build\Release\lib\LLVMLinker.lib
D:\llvm-project\build\Release\lib\LLVMInstrumentation.lib
D:\llvm-project\build\Release\lib\LLVMFrontendOpenMP.lib
D:\llvm-project\build\Release\lib\LLVMFrontendOffloading.lib
D:\llvm-project\build\Release\lib\LLVMFrontendOpenACC.lib
D:\llvm-project\build\Release\lib\LLVMFrontendHLSL.lib
D:\llvm-project\build\Release\lib\LLVMFrontendDriver.lib
D:\llvm-project\build\Release\lib\LLVMFrontendAtomic.lib
D:\llvm-project\build\Release\lib\LLVMExtensions.lib
D:\llvm-project\build\Release\lib\LLVMDWARFLinkerParallel.lib
D:\llvm-project\build\Release\lib\LLVMDWARFLinkerClassic.lib
D:\llvm-project\build\Release\lib\LLVMDWARFLinker.lib
D:\llvm-project\build\Release\lib\LLVMGlobalISel.lib
D:\llvm-project\build\Release\lib\LLVMMIRParser.lib
D:\llvm-project\build\Release\lib\LLVMAsmPrinter.lib
D:\llvm-project\build\Release\lib\LLVMSelectionDAG.lib
D:\llvm-project\build\Release\lib\LLVMCodeGen.lib
D:\llvm-project\build\Release\lib\LLVMTarget.lib
D:\llvm-project\build\Release\lib\LLVMObjCARCOpts.lib
D:\llvm-project\build\Release\lib\LLVMCodeGenTypes.lib
D:\llvm-project\build\Release\lib\LLVMCGData.lib
D:\llvm-project\build\Release\lib\LLVMIRPrinter.lib
D:\llvm-project\build\Release\lib\LLVMInterfaceStub.lib
D:\llvm-project\build\Release\lib\LLVMFileCheck.lib
D:\llvm-project\build\Release\lib\LLVMFuzzMutate.lib
D:\llvm-project\build\Release\lib\LLVMScalarOpts.lib
D:\llvm-project\build\Release\lib\LLVMInstCombine.lib
D:\llvm-project\build\Release\lib\LLVMAggressiveInstCombine.lib
D:\llvm-project\build\Release\lib\LLVMTransformUtils.lib
D:\llvm-project\build\Release\lib\LLVMBitWriter.lib
D:\llvm-project\build\Release\lib\LLVMAnalysis.lib
D:\llvm-project\build\Release\lib\LLVMProfileData.lib
D:\llvm-project\build\Release\lib\LLVMSymbolize.lib
D:\llvm-project\build\Release\lib\LLVMDebugInfoBTF.lib
D:\llvm-project\build\Release\lib\LLVMDebugInfoPDB.lib
D:\llvm-project\build\Release\lib\LLVMDebugInfoMSF.lib
D:\llvm-project\build\Release\lib\LLVMDebugInfoCodeView.lib
D:\llvm-project\build\Release\lib\LLVMDebugInfoDWARF.lib
D:\llvm-project\build\Release\lib\LLVMObject.lib
D:\llvm-project\build\Release\lib\LLVMTextAPI.lib
D:\llvm-project\build\Release\lib\LLVMMCParser.lib
D:\llvm-project\build\Release\lib\LLVMIRReader.lib
D:\llvm-project\build\Release\lib\LLVMAsmParser.lib
D:\llvm-project\build\Release\lib\LLVMMC.lib
D:\llvm-project\build\Release\lib\LLVMBitReader.lib
D:\llvm-project\build\Release\lib\LLVMFuzzerCLI.lib
D:\llvm-project\build\Release\lib\LLVMCore.lib
D:\llvm-project\build\Release\lib\LLVMRemarks.lib
D:\llvm-project\build\Release\lib\LLVMBitstreamReader.lib
D:\llvm-project\build\Release\lib\LLVMBinaryFormat.lib
D:\llvm-project\build\Release\lib\LLVMTargetParser.lib
D:\llvm-project\build\Release\lib\LLVMTableGen.lib
D:\llvm-project\build\Release\lib\LLVMSupport.lib
D:\llvm-project\build\Release\lib\LLVMDemangle.lib
psapi.lib
shell32.lib
ole32.lib
uuid.lib
advapi32.lib
ws2_32.lib
ntdll.lib
zlib.lib
4. 成功
把上文的信息都配置好之后,就可以啦
(从chatgpt生成来的代码而已)
#include "llvm/IRReader/IRReader.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/raw_ostream.h"
int main() {
llvm::LLVMContext Context;
llvm::SMDiagnostic Err;
// 读取 IR 文件
auto Module = llvm::parseIRFile("C:\\Users\\90965\\Desktop\\llvm\\helloworld.ll", Err, Context);
if (!Module) {
Err.print("llvm_example", llvm::errs());
return 1;
}
// 输出模块信息
Module->print(llvm::outs(), nullptr);
return 0;
}
DEBUG版信息[仅仅只是我的个人笔记]
D:\llvm-project\llvm\include
D:\llvm-project\build\include
D:\llvm-project\build\Debug\lib
D:\llvm-project\build\Debug\lib\LLVMWindowsManifest.lib
D:\llvm-project\build\Debug\lib\LLVMXRay.lib
D:\llvm-project\build\Debug\lib\LLVMLibDriver.lib
D:\llvm-project\build\Debug\lib\LLVMDlltoolDriver.lib
D:\llvm-project\build\Debug\lib\LLVMTelemetry.lib
D:\llvm-project\build\Debug\lib\LLVMTextAPIBinaryReader.lib
D:\llvm-project\build\Debug\lib\LLVMCoverage.lib
D:\llvm-project\build\Debug\lib\LLVMLineEditor.lib
D:\llvm-project\build\Debug\lib\LLVMX86TargetMCA.lib
D:\llvm-project\build\Debug\lib\LLVMX86Disassembler.lib
D:\llvm-project\build\Debug\lib\LLVMX86AsmParser.lib
D:\llvm-project\build\Debug\lib\LLVMX86CodeGen.lib
D:\llvm-project\build\Debug\lib\LLVMX86Desc.lib
D:\llvm-project\build\Debug\lib\LLVMX86Info.lib
D:\llvm-project\build\Debug\lib\LLVMOrcDebugging.lib
D:\llvm-project\build\Debug\lib\LLVMOrcJIT.lib
D:\llvm-project\build\Debug\lib\LLVMWindowsDriver.lib
D:\llvm-project\build\Debug\lib\LLVMMCJIT.lib
D:\llvm-project\build\Debug\lib\LLVMJITLink.lib
D:\llvm-project\build\Debug\lib\LLVMInterpreter.lib
D:\llvm-project\build\Debug\lib\LLVMExecutionEngine.lib
D:\llvm-project\build\Debug\lib\LLVMRuntimeDyld.lib
D:\llvm-project\build\Debug\lib\LLVMOrcTargetProcess.lib
D:\llvm-project\build\Debug\lib\LLVMOrcShared.lib
D:\llvm-project\build\Debug\lib\LLVMDWP.lib
D:\llvm-project\build\Debug\lib\LLVMDebugInfoLogicalView.lib
D:\llvm-project\build\Debug\lib\LLVMDebugInfoGSYM.lib
D:\llvm-project\build\Debug\lib\LLVMOption.lib
D:\llvm-project\build\Debug\lib\LLVMObjectYAML.lib
D:\llvm-project\build\Debug\lib\LLVMObjCopy.lib
D:\llvm-project\build\Debug\lib\LLVMMCA.lib
D:\llvm-project\build\Debug\lib\LLVMMCDisassembler.lib
D:\llvm-project\build\Debug\lib\LLVMLTO.lib
D:\llvm-project\build\Debug\lib\LLVMPasses.lib
D:\llvm-project\build\Debug\lib\LLVMHipStdPar.lib
D:\llvm-project\build\Debug\lib\LLVMCFGuard.lib
D:\llvm-project\build\Debug\lib\LLVMCoroutines.lib
D:\llvm-project\build\Debug\lib\LLVMipo.lib
D:\llvm-project\build\Debug\lib\LLVMVectorize.lib
D:\llvm-project\build\Debug\lib\LLVMSandboxIR.lib
D:\llvm-project\build\Debug\lib\LLVMLinker.lib
D:\llvm-project\build\Debug\lib\LLVMInstrumentation.lib
D:\llvm-project\build\Debug\lib\LLVMFrontendOpenMP.lib
D:\llvm-project\build\Debug\lib\LLVMFrontendOffloading.lib
D:\llvm-project\build\Debug\lib\LLVMFrontendOpenACC.lib
D:\llvm-project\build\Debug\lib\LLVMFrontendHLSL.lib
D:\llvm-project\build\Debug\lib\LLVMFrontendDriver.lib
D:\llvm-project\build\Debug\lib\LLVMFrontendAtomic.lib
D:\llvm-project\build\Debug\lib\LLVMExtensions.lib
D:\llvm-project\build\Debug\lib\LLVMDWARFLinkerParallel.lib
D:\llvm-project\build\Debug\lib\LLVMDWARFLinkerClassic.lib
D:\llvm-project\build\Debug\lib\LLVMDWARFLinker.lib
D:\llvm-project\build\Debug\lib\LLVMGlobalISel.lib
D:\llvm-project\build\Debug\lib\LLVMMIRParser.lib
D:\llvm-project\build\Debug\lib\LLVMAsmPrinter.lib
D:\llvm-project\build\Debug\lib\LLVMSelectionDAG.lib
D:\llvm-project\build\Debug\lib\LLVMCodeGen.lib
D:\llvm-project\build\Debug\lib\LLVMTarget.lib
D:\llvm-project\build\Debug\lib\LLVMObjCARCOpts.lib
D:\llvm-project\build\Debug\lib\LLVMCodeGenTypes.lib
D:\llvm-project\build\Debug\lib\LLVMCGData.lib
D:\llvm-project\build\Debug\lib\LLVMIRPrinter.lib
D:\llvm-project\build\Debug\lib\LLVMInterfaceStub.lib
D:\llvm-project\build\Debug\lib\LLVMFileCheck.lib
D:\llvm-project\build\Debug\lib\LLVMFuzzMutate.lib
D:\llvm-project\build\Debug\lib\LLVMScalarOpts.lib
D:\llvm-project\build\Debug\lib\LLVMInstCombine.lib
D:\llvm-project\build\Debug\lib\LLVMAggressiveInstCombine.lib
D:\llvm-project\build\Debug\lib\LLVMTransformUtils.lib
D:\llvm-project\build\Debug\lib\LLVMBitWriter.lib
D:\llvm-project\build\Debug\lib\LLVMAnalysis.lib
D:\llvm-project\build\Debug\lib\LLVMProfileData.lib
D:\llvm-project\build\Debug\lib\LLVMSymbolize.lib
D:\llvm-project\build\Debug\lib\LLVMDebugInfoBTF.lib
D:\llvm-project\build\Debug\lib\LLVMDebugInfoPDB.lib
D:\llvm-project\build\Debug\lib\LLVMDebugInfoMSF.lib
D:\llvm-project\build\Debug\lib\LLVMDebugInfoCodeView.lib
D:\llvm-project\build\Debug\lib\LLVMDebugInfoDWARF.lib
D:\llvm-project\build\Debug\lib\LLVMObject.lib
D:\llvm-project\build\Debug\lib\LLVMTextAPI.lib
D:\llvm-project\build\Debug\lib\LLVMMCParser.lib
D:\llvm-project\build\Debug\lib\LLVMIRReader.lib
D:\llvm-project\build\Debug\lib\LLVMAsmParser.lib
D:\llvm-project\build\Debug\lib\LLVMMC.lib
D:\llvm-project\build\Debug\lib\LLVMBitReader.lib
D:\llvm-project\build\Debug\lib\LLVMFuzzerCLI.lib
D:\llvm-project\build\Debug\lib\LLVMCore.lib
D:\llvm-project\build\Debug\lib\LLVMRemarks.lib
D:\llvm-project\build\Debug\lib\LLVMBitstreamReader.lib
D:\llvm-project\build\Debug\lib\LLVMBinaryFormat.lib
D:\llvm-project\build\Debug\lib\LLVMTargetParser.lib
D:\llvm-project\build\Debug\lib\LLVMTableGen.lib
D:\llvm-project\build\Debug\lib\LLVMSupport.lib
D:\llvm-project\build\Debug\lib\LLVMDemangle.lib
psapi.lib
shell32.lib
ole32.lib
uuid.lib
advapi32.lib
ws2_32.lib
ntdll.lib
zlib.lib