2017-01-20 18 views
0

Я пытаюсь создать CMakeList для компиляции примера программы ModuleMaker на ОС Windows 10.CMakeList для ModuleMaker LLVM пример программы

Все кажется хорошо, но я получаю следующее сообщение об ошибке:

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)" ([email protected]@@[email protected]@[email protected]@[email protected]@[email protected]) 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}) 
+0

Какую версию LLVM вы связываете? API LLVM изменяется совсем немного между выпусками. – tambre

+0

3.9.1 является версией – Shuzheng

+0

И является ли данная программа (которую я предполагаю, что вы не писали), которая, как известно, совместима с LLVM 3.9.1? – tambre

ответ

1

Вам нужно добавить bitwriter в llvm_map_components_to_libnames также связать с bitwriter компонентом и использовать функцию WriteBitcodeToFile.

Имена доступных компонентов LLVM должны быть доступны через переменную LLVM_AVAILABLE_LIBS. Для всех доступных переменных о LLVM см. LLVMConfig.cmake.in.

Вы можете распечатать содержимое LLVM_AVAILABLE_LIBS, выполнив message(${LLVM_AVAILABLE_LIBS}).

+0

Где я могу увидеть компоненты и их имена? – Shuzheng

+0

Можете ли вы получить хороший источник знаний? – Shuzheng

+0

@Shuzheng После прочтения кода для модуля он должен быть доступен через 'LLVM_AVAILABLE_LIBS'. Также добавьте ссылку на указанный файл кода, где я нашел это. – tambre

 Смежные вопросы

  • Нет связанных вопросов^_^