単子葉類プログラマーのメモ

プログラミング関連の自分用メモだけど他の人の役に立つかもしれないので公開しておく感じのブログ

LLVM API利用時のVisual Studio C++のプロジェクトのプロパティの設定

LLVM APIを使うためのコンパイルオプション(Visual Studioのプロジェクトのプロパティ)の設定内容についてのメモ。

マクロ、インクルードディレクトリや追加の依存ファイル(libファイル)の指定は当然必要だが、ほかにもLLVM API独自のクセのある設定が必要。

※動作確認環境はLLVM 10.0.0、Visual Studio 2019 Community (Version 16.5.4)

llvm-configコマンド

LLVMllvm-configコマンドを利用する。

このコマンドは、LLVM APIを利用するためのコンパイルオプションやリンクオプションの文字列を出力してくれる。

Visual Studioのプロジェクト設定

Visual Studioのメニューのプロジェクト - (プロジェクト名)のプロパティで以下を設定する。

  1. 構成のプロパティ - C/C++ - コマンドライン - 追加のオプションllvm-config --cxxflagsの実行結果を指定
    • 実行結果の例

       -I"path\to\llvm-source\include" -I"path\to\llvm-binary\include" -std:c++14   /EHs-c- /GR- -D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_NONSTDC_NO_WARNINGS -D_SCL_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_WARNINGS -DUNICODE -D_UNICODE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
      
      • 例の中のpath\to\llvm-source\は、LLVMのビルド時にCMakeのWhter is the source codeに指定したパス(LLVMのビルド手順はこちら)。
      • path\to\llvm-binaryは、CMakeのWhere to build the binariesに指定したパス。
  2. 構成のプロパティ - C/C++ - コマンドライン - 追加のオプションに以下も追加
    (これはllvm-configは出力してくれない……。LLVMのexampleはこれらを指定している。これらがないとLLVMのヘッダファイルでコンパイルエラーが発生する)

    -D_HAS_EXCEPTIONS=0 /wd"4141" /wd"4146" /wd"4244" /wd"4267" /wd"4291" /wd"4345" /wd"4351" /wd"4456" /wd"4457" /wd"4458" /wd"4459" /wd"4503" /wd"4624" /wd"4722" /wd"4100" /wd"4127" /wd"4512" /wd"4505" /wd"4610" /wd"4510" /wd"4702" /wd"4245" /wd"4706" /wd"4310" /wd"4701" /wd"4703" /wd"4389" /wd"4611" /wd"4805" /wd"4204" /wd"4577" /wd"4091" /wd"4592" /wd"4319" /wd"4709" /wd"4324"
    
  3. 構成のプロパティ - C/C++ - コード生成 - C++の例外を有効にするいいえに設定
  4. 構成のプロパティ - リンカー - コマンドライン - 追加のオプションllvm-config --ldflagsllvm-config --libsの実行結果を追加
    • 実行結果の例

       -LIBPATH:path\to\llvm-binary\lib
       path\to\llvm-binary\lib\LLVMXRay.lib path\to\llvm-binary\lib\LLVMWindowsManifest.lib path\to\llvm-binary\lib\LLVMTestingSupport.lib path\to\llvm-binary\lib\LLVMTableGen.lib path\to\llvm-binary\lib\LLVMSymbolize.lib path\to\llvm-binary\lib\LLVMDebugInfoPDB.lib path\to\llvm-binary\lib\LLVMOrcJIT.lib path\to\llvm-binary\lib\LLVMOrcError.lib path\to\llvm-binary\lib\LLVMJITLink.lib path\to\llvm-binary\lib\LLVMObjectYAML.lib path\to\llvm-binary\lib\LLVMMCA.lib path\to\llvm-binary\lib\LLVMLTO.lib path\to\llvm-binary\lib\LLVMPasses.lib path\to\llvm-binary\lib\LLVMObjCARCOpts.lib path\to\llvm-binary\lib\LLVMLineEditor.lib path\to\llvm-binary\lib\LLVMLibDriver.lib path\to\llvm-binary\lib\LLVMInterpreter.lib path\to\llvm-binary\lib\gtest_main.lib path\to\llvm-binary\lib\gtest.lib path\to\llvm-binary\lib\LLVMFuzzMutate.lib path\to\llvm-binary\lib\LLVMFrontendOpenMP.lib path\to\llvm-binary\lib\LLVMMCJIT.lib path\to\llvm-binary\lib\LLVMExecutionEngine.lib path\to\llvm-binary\lib\LLVMRuntimeDyld.lib path\to\llvm-binary\lib\LLVMDWARFLinker.lib path\to\llvm-binary\lib\LLVMDlltoolDriver.lib path\to\llvm-binary\lib\LLVMOption.lib path\to\llvm-binary\lib\LLVMDebugInfoGSYM.lib path\to\llvm-binary\lib\LLVMCoverage.lib path\to\llvm-binary\lib\LLVMCoroutines.lib path\to\llvm-binary\lib\LLVMXCoreDisassembler.lib path\to\llvm-binary\lib\LLVMXCoreCodeGen.lib path\to\llvm-binary\lib\LLVMXCoreDesc.lib path\to\llvm-binary\lib\LLVMXCoreInfo.lib path\to\llvm-binary\lib\LLVMX86Disassembler.lib path\to\llvm-binary\lib\LLVMX86AsmParser.lib path\to\llvm-binary\lib\LLVMX86CodeGen.lib path\to\llvm-binary\lib\LLVMX86Desc.lib path\to\llvm-binary\lib\LLVMX86Utils.lib path\to\llvm-binary\lib\LLVMX86Info.lib path\to\llvm-binary\lib\LLVMWebAssemblyDisassembler.lib path\to\llvm-binary\lib\LLVMWebAssemblyCodeGen.lib path\to\llvm-binary\lib\LLVMWebAssemblyDesc.lib path\to\llvm-binary\lib\LLVMWebAssemblyAsmParser.lib path\to\llvm-binary\lib\LLVMWebAssemblyInfo.lib path\to\llvm-binary\lib\LLVMSystemZDisassembler.lib path\to\llvm-binary\lib\LLVMSystemZCodeGen.lib path\to\llvm-binary\lib\LLVMSystemZAsmParser.lib path\to\llvm-binary\lib\LLVMSystemZDesc.lib path\to\llvm-binary\lib\LLVMSystemZInfo.lib path\to\llvm-binary\lib\LLVMSparcDisassembler.lib path\to\llvm-binary\lib\LLVMSparcCodeGen.lib path\to\llvm-binary\lib\LLVMSparcAsmParser.lib path\to\llvm-binary\lib\LLVMSparcDesc.lib path\to\llvm-binary\lib\LLVMSparcInfo.lib path\to\llvm-binary\lib\LLVMRISCVDisassembler.lib path\to\llvm-binary\lib\LLVMRISCVCodeGen.lib path\to\llvm-binary\lib\LLVMRISCVAsmParser.lib path\to\llvm-binary\lib\LLVMRISCVDesc.lib path\to\llvm-binary\lib\LLVMRISCVUtils.lib path\to\llvm-binary\lib\LLVMRISCVInfo.lib path\to\llvm-binary\lib\LLVMPowerPCDisassembler.lib path\to\llvm-binary\lib\LLVMPowerPCCodeGen.lib path\to\llvm-binary\lib\LLVMPowerPCAsmParser.lib path\to\llvm-binary\lib\LLVMPowerPCDesc.lib path\to\llvm-binary\lib\LLVMPowerPCInfo.lib path\to\llvm-binary\lib\LLVMNVPTXCodeGen.lib path\to\llvm-binary\lib\LLVMNVPTXDesc.lib path\to\llvm-binary\lib\LLVMNVPTXInfo.lib path\to\llvm-binary\lib\LLVMMSP430Disassembler.lib path\to\llvm-binary\lib\LLVMMSP430CodeGen.lib path\to\llvm-binary\lib\LLVMMSP430AsmParser.lib path\to\llvm-binary\lib\LLVMMSP430Desc.lib path\to\llvm-binary\lib\LLVMMSP430Info.lib path\to\llvm-binary\lib\LLVMMipsDisassembler.lib path\to\llvm-binary\lib\LLVMMipsCodeGen.lib path\to\llvm-binary\lib\LLVMMipsAsmParser.lib path\to\llvm-binary\lib\LLVMMipsDesc.lib path\to\llvm-binary\lib\LLVMMipsInfo.lib path\to\llvm-binary\lib\LLVMLanaiDisassembler.lib path\to\llvm-binary\lib\LLVMLanaiCodeGen.lib path\to\llvm-binary\lib\LLVMLanaiAsmParser.lib path\to\llvm-binary\lib\LLVMLanaiDesc.lib path\to\llvm-binary\lib\LLVMLanaiInfo.lib path\to\llvm-binary\lib\LLVMHexagonDisassembler.lib path\to\llvm-binary\lib\LLVMHexagonCodeGen.lib path\to\llvm-binary\lib\LLVMHexagonAsmParser.lib path\to\llvm-binary\lib\LLVMHexagonDesc.lib path\to\llvm-binary\lib\LLVMHexagonInfo.lib path\to\llvm-binary\lib\LLVMBPFDisassembler.lib path\to\llvm-binary\lib\LLVMBPFCodeGen.lib path\to\llvm-binary\lib\LLVMBPFAsmParser.lib path\to\llvm-binary\lib\LLVMBPFDesc.lib path\to\llvm-binary\lib\LLVMBPFInfo.lib path\to\llvm-binary\lib\LLVMARMDisassembler.lib path\to\llvm-binary\lib\LLVMARMCodeGen.lib path\to\llvm-binary\lib\LLVMARMAsmParser.lib path\to\llvm-binary\lib\LLVMARMDesc.lib path\to\llvm-binary\lib\LLVMARMUtils.lib path\to\llvm-binary\lib\LLVMARMInfo.lib path\to\llvm-binary\lib\LLVMAMDGPUDisassembler.lib path\to\llvm-binary\lib\LLVMAMDGPUCodeGen.lib path\to\llvm-binary\lib\LLVMMIRParser.lib path\to\llvm-binary\lib\LLVMipo.lib path\to\llvm-binary\lib\LLVMInstrumentation.lib path\to\llvm-binary\lib\LLVMVectorize.lib path\to\llvm-binary\lib\LLVMLinker.lib path\to\llvm-binary\lib\LLVMIRReader.lib path\to\llvm-binary\lib\LLVMAsmParser.lib path\to\llvm-binary\lib\LLVMAMDGPUAsmParser.lib path\to\llvm-binary\lib\LLVMAMDGPUDesc.lib path\to\llvm-binary\lib\LLVMAMDGPUUtils.lib path\to\llvm-binary\lib\LLVMAMDGPUInfo.lib path\to\llvm-binary\lib\LLVMAArch64Disassembler.lib path\to\llvm-binary\lib\LLVMMCDisassembler.lib path\to\llvm-binary\lib\LLVMAArch64CodeGen.lib path\to\llvm-binary\lib\LLVMCFGuard.lib path\to\llvm-binary\lib\LLVMGlobalISel.lib path\to\llvm-binary\lib\LLVMSelectionDAG.lib path\to\llvm-binary\lib\LLVMAsmPrinter.lib path\to\llvm-binary\lib\LLVMDebugInfoDWARF.lib path\to\llvm-binary\lib\LLVMCodeGen.lib path\to\llvm-binary\lib\LLVMTarget.lib path\to\llvm-binary\lib\LLVMScalarOpts.lib path\to\llvm-binary\lib\LLVMInstCombine.lib path\to\llvm-binary\lib\LLVMAggressiveInstCombine.lib path\to\llvm-binary\lib\LLVMTransformUtils.lib path\to\llvm-binary\lib\LLVMBitWriter.lib path\to\llvm-binary\lib\LLVMAnalysis.lib path\to\llvm-binary\lib\LLVMProfileData.lib path\to\llvm-binary\lib\LLVMObject.lib path\to\llvm-binary\lib\LLVMTextAPI.lib path\to\llvm-binary\lib\LLVMBitReader.lib path\to\llvm-binary\lib\LLVMCore.lib path\to\llvm-binary\lib\LLVMRemarks.lib path\to\llvm-binary\lib\LLVMBitstreamReader.lib path\to\llvm-binary\lib\LLVMAArch64AsmParser.lib path\to\llvm-binary\lib\LLVMMCParser.lib path\to\llvm-binary\lib\LLVMAArch64Desc.lib path\to\llvm-binary\lib\LLVMMC.lib path\to\llvm-binary\lib\LLVMDebugInfoCodeView.lib path\to\llvm-binary\lib\LLVMDebugInfoMSF.lib path\to\llvm-binary\lib\LLVMBinaryFormat.lib path\to\llvm-binary\lib\LLVMAArch64Utils.lib path\to\llvm-binary\lib\LLVMAArch64Info.lib path\to\llvm-binary\lib\LLVMSupport.lib path\to\llvm-binary\lib\LLVMDemangle.lib
      
      • 例の中のpath\to\llvm-binaryについては先述したとおり