构建LLVM传递源 - 未定义的符号

时间:2016-05-21 04:20:11

标签: cmake llvm

我正在尝试使用说明here构建LLVM传递,并将其链接到Julia安装的LLVM副本。传递当前正在成功编译,但是cmake在链接未定义的符号错误时失败。

[ 50%] Building CXX object VectorizePass/CMakeFiles/VectorizePass.dir/VectorizePass.cpp.o
[100%] Linking CXX shared module libVectorizePass.so
Undefined symbols for architecture x86_64:
    "llvm::raw_ostream::write_escaped(llvm::StringRef, bool)", referenced from:
  (anonymous namespace)::Hello::runOnFunction(llvm::Function&) in VectorizePass.cpp.o
   "llvm::raw_ostream::write(char const*, unsigned long)", referenced from:
        llvm::raw_ostream::operator<<(llvm::StringRef) in VectorizePass.cpp.o

有几十个未定义的符号错误,后跟

"vtable for llvm::Pass", referenced from:
  llvm::Pass::Pass(llvm::PassKind, char&) in VectorizePass.cpp.o
NOTE: a missing vtable usually means the first non-inline virtual 
    member function has no definition.

VectorizePass.cpp

#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"


using namespace llvm;

namespace {
    struct Hello : public FunctionPass {
        static char ID;
        Hello() : FunctionPass(ID) {}

        bool runOnFunction(Function &F) override {
            errs() << "Hello: ";
            errs().write_escaped(F.getName()) << "\n";
            return false;
        }
    };
}

char Hello::ID = 0;
static RegisterPass<Hello> X("Hello",  "My Hello World Pass",  false, false);

这与教程中的完全一样。

CMakeLists.txt(1)

add_library(VectorizePass MODULE VectorizePass.cpp)
SET(CMAKE_CXX_FLAGS "-std=c++11 -Wall -fno-rtti -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS -fPIC")

CMakeLists.txt(2)

project(VectorizePass)

set(LLVM_DIR "/Users/user/julia5/deps/build/llvm-3.7.1/build_Release")
set(LLVM_TOOLS_BINARY_DIR "/Users/user/julia5/deps/build/llvm-3.7.1/build_Release/Release/bin")

include_directories(${LLVM_INCLUDE_DIRS})
include_directories("/Users/user/julia5/deps/build/llvm-3.7.1/build_Release/include")
include_directories("/Users/user/julia5/deps/srccache/llvm-3.7.1/include")
link_directories("/Users/user/julia5/deps/build/llvm-3.7.1/build_Release/Release/lib")
link_directories("/Users/user/julia5/deps/build/llvm-3.7.1/build_Release/lib")
link_directories(${LLVM_LINK_DIRS})
add_definitions(${LLVM_DEFINITIONS})


add_subdirectory(VectorizePass)

显然,由于某种原因,CMake找不到合适的目标文件,即使它们在link_directories语句中的目录中 。我错过了什么?我对CMake很新,所以它可能是显而易见的。

我已按照建议here尝试include(AddLLVM),但CMake报告无法找到AddLLVMThis Stack post还建议使用常规Makefile,但在编译源外传递时不起作用,因为常规LLVM Makefile.common / Makefile.config中的所有路径都是相对的并且不是干活了。

1 个答案:

答案 0 :(得分:0)

您是否阅读过this?您需要使用add_llvm_loadable_module()宏来定义传递目标。