我是如何配置LLVM的vs编写环境的【针对Visual Studio 2022】

发帖原因

今天刚装完了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记事本,甚至微信文件传输助手也行)

  1. llvm-config --cxxflags
  2. llvm-config --ldflags
  3. llvm-config --libs
  4. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值