3

我正在尝试在我的项目目录下开发一个 llvm 通行证。为此,我遵循http://llvm.org/docs/CMake.html#developing-llvm-pass-out-of-source中的信息。我在这个链接中适当地创建了我的 CMakeFiles,我的最终项目目录就像;

|-- src
|   |-- CMakeLists.txt
|   |-- bigForPass
|   |   |-- CMakeLists.txt
|   |   |-- bigForPass.cpp
|   |   |-- merged.bc
|   |-- build

我还将我的源文件与 llvm 根目录链接起来,没有任何问题。最后,我在“build”文件夹下进行构建,并且我的共享库成功创建,没有问题(在 build/bin 文件夹下),名称为 LLVMHello1.dylib。但是,当我尝试使用命令运行 merge.bc 文件(包含我的 llvm 代码)时

opt -load ../build/bin/LLVMHello1.dylib -bishe_insert <merged.bc> final.bc

我不断收到错误消息;

Error opening '../build/bin/LLVMHello1.dylib': dlopen(../build/bin/LLVMHello1.dylib, 9): Symbol not found: __ZTIN4llvm10ModulePassE
  Referenced from: ../build/bin/LLVMHello1.dylib
  Expected in: flat namespace
 in ../build/bin/LLVMHello1.dylib
  -load request ignored.

对此有任何想法和建议吗?

提前非常感谢。

4

1 回答 1

7

来自http://www.jiang925.com/node/28

未定义符号:_ZTIN4llvm12FunctionPassE LLVM 主构建系统与 cmake 对构建外源代码的支持之间存在不一致。LLVM 二进制文件是在没有运行时类型信息“-fno-rtti”的情况下构建的。因此,必须以相同的方式构建源外通行证,否则 opt 会抱怨符号“_ZTIN4llvm12FunctionPassE”未定义。

要解决这个问题,必须在启用 RTTI 的情况下编译 LLVM。在cmake中添加“-DLLVM_REQUIRES_RTTI=1”,或者在make中添加“REQUIRES_RTTI=1”。

所以我添加SET(CMAKE_CXX_FLAGS "-Wall -fno-rtti")到我的通行证库的 CMakeLists.txt 中,然后它就可以工作了。

于 2014-08-18T07:33:18.060 回答