正在生成源代码未定义符号的LLVM传递



我正试图使用此处的说明构建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的新手,所以这可能是显而易见的。

我已经按照这里的建议尝试了include(AddLLVM),但CMake报告它找不到AddLLVM。这篇Stack文章还建议使用常规Makefile,但在编译源代码外的过程时不起作用,因为常规LLVMMakefile.common/Makefile.config中的所有路径都是相对的,根本不起作用。

你读过这个吗?您需要使用add_llvm_loadable_module()宏为您的通行证定义目标。

最新更新