用于 ModuleMaker LLVM 示例程序的 CMakeList
CMakeList for ModuleMaker LLVM sample program
我正在尝试创建一个 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})
您需要将 bitwriter
添加到 llvm_map_components_to_libnames
以及 link 与 bitwriter
组件并使用 WriteBitcodeToFile
功能。
可用的 LLVM 组件的名称应该可以通过 LLVM_AVAILABLE_LIBS
变量获得。有关 LLVM 的所有可用变量,请参阅 LLVMConfig.cmake.in.
您可以通过 message(${LLVM_AVAILABLE_LIBS})
.
打印 LLVM_AVAILABLE_LIBS
的内容
我正在尝试创建一个 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})
您需要将 bitwriter
添加到 llvm_map_components_to_libnames
以及 link 与 bitwriter
组件并使用 WriteBitcodeToFile
功能。
可用的 LLVM 组件的名称应该可以通过 LLVM_AVAILABLE_LIBS
变量获得。有关 LLVM 的所有可用变量,请参阅 LLVMConfig.cmake.in.
您可以通过 message(${LLVM_AVAILABLE_LIBS})
.
LLVM_AVAILABLE_LIBS
的内容