【问题标题】:CMakeList for ModuleMaker LLVM sample programModuleMaker LLVM 示例程序的 CMakeList
【发布时间】:2017-01-20 18:14:01
【问题描述】:

我正在尝试创建一个 CMakeList 用于在 Windows 10 上编译 ModuleMaker 示例程序。

一切似乎都很好,但我收到以下错误:

1>  C:\Program Files (x86)\LLVM\include\llvm/IR/Metadata.h(716): note: see reference to class template instantiation 'llvm::PointerUnion<llvm::LLVMContext *,llvm::ReplaceableMetadataImpl *>' being compiled
1>ModuleMaker.obj : error LNK2019: unresolved external symbol "void __cdecl llvm::WriteBitcodeToFile(class llvm::Module const *,class llvm::raw_ostream &,bool,class llvm::ModuleSummaryIndex const *,bool)" (?WriteBitcodeToFile@llvm@@YAXPBVModule@1@AAVraw_ostream@1@_NPBVModuleSummaryIndex@1@2@Z) referenced in function _main
1>C:\Users\nlykkei\llvm\src\examples\ModuleMaker\Debug\ModuleMaker.exe : fatal error LNK1120: 1 unresolved externals

即,除了 WriteBitcodeToFile 函数之外,所有链接都很好。

有人知道为什么会这样吗?如果有,请提供详细的解释。

程序:

#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/Support/raw_ostream.h"

using namespace llvm;

int main() {
  LLVMContext Context;

  // Create the "module" or "program" or "translation unit" to hold the
  // function
  Module *M = new Module("test", Context);

  // Create the main function: first create the type 'int ()'
  FunctionType *FT =
    FunctionType::get(Type::getInt32Ty(Context), /*not vararg*/false);

  // By passing a module as the last parameter to the Function constructor,
  // it automatically gets appended to the Module.
  Function *F = Function::Create(FT, Function::ExternalLinkage, "main", M);

  // Add a basic block to the function... again, it automatically inserts
  // because of the last argument.
  BasicBlock *BB = BasicBlock::Create(Context, "EntryBlock", F);

  // Get pointers to the constant integers...
  Value *Two = ConstantInt::get(Type::getInt32Ty(Context), 2);
  Value *Three = ConstantInt::get(Type::getInt32Ty(Context), 3);

  // Create the add instruction... does not insert...
  Instruction *Add = BinaryOperator::Create(Instruction::Add, Two, Three,
                                            "addresult");

  // explicitly insert it into the basic block...
  BB->getInstList().push_back(Add);

  // Create the return instruction and add it to the basic block
  BB->getInstList().push_back(ReturnInst::Create(Context, Add));

  // Output the bitcode file to stdout
  WriteBitcodeToFile(M, outs());

  // Delete the module and all of its contents.
  delete M;
  return 0;
}

CMakeList.txt:

cmake_minimum_required(VERSION 3.4.3)
project(ModuleMaker)

find_package(LLVM REQUIRED CONFIG)

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

message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")


add_executable(ModuleMaker ModuleMaker.cpp)

llvm_map_components_to_libnames(llvm_libs support core irreader)

target_link_libraries(ModuleMaker ${llvm_libs})

【问题讨论】:

  • 您链接的是哪个版本的 LLVM? LLVM API 在不同版本之间发生了相当大的变化。
  • 3.9.1是版本
  • 给定的程序(我假设你没有编写)是否已知与 LLVM 3.9.1 兼容?
  • 是的,它在 LLVM 的源文件夹中。
  • 在示例目录中。

标签: c++ cmake clang llvm


【解决方案1】:

您需要将bitwriter 添加到llvm_map_components_to_libnames 以同时链接bitwriter 组件并使用WriteBitcodeToFile 功能。

可用 LLVM 组件的名称应可通过 LLVM_AVAILABLE_LIBS 变量获得。有关 LLVM 的所有可用变量,请参阅LLVMConfig.cmake.in

你可以通过message(${LLVM_AVAILABLE_LIBS})打印LLVM_AVAILABLE_LIBS的内容。

【讨论】:

  • 在哪里可以看到组件及其名称?
  • @Shuzheng 看了模块的代码,应该可以通过LLVM_AVAILABLE_LIBS获得。还要添加一个指向给定代码文件的链接,我在其中找到了它。
  • 如何查看这些变量的值?
  • 对不起,你能举个例子吗? :/ 我很困惑。
  • @Shuzheng 已将其添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2020-03-12
相关资源
最近更新 更多