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' フォルダーの下にビルドを作成すると、LLVMHello1.dylib という名前の共有ライブラリが (build/bin フォルダーの下に) 問題なく正常に作成されます。ただし、コマンドを使用してmerged.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」なしでビルドされます。したがって、アウトオブソース パスは同じ方法でビルドする必要があります。そうしないと、シンボル「_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 に答える