4

libclang で利用可能なフロントエンドを使用して、C コードの単純な構文チェッカーを作成しようとしています。展開上の問題により、libclang 内のすべてのライブラリを静的にリンクできる必要があり、すべてのライブラリを含む .so ファイルを渡さないようにする必要があります。

ソースからclang/llvmを構築しています.llvm/Release + Asserts / libには、使用できるはずの.aファイルがたくさんありますが、動作していないようです(リンカは何千もの.シンボルの欠落に関するエラー)。ただし、libclang.so を使用してコンパイルすると、次のようにそのディレクトリにも存在します。

clang main.c -o bin/dlc -I../llvm/tools/clang/include -L../llvm/Release+Asserts/lib/ -lclang

すべてがうまくいくようです。

これを機能させるために含める必要がある .a ファイルの最小セットは何ですか? ビルド出力ディレクトリに絶対にすべての .a ファイルを含めようとしましたが、それらは異なる順序で clang/gcc に提供されましたが、成功しませんでした。libclang の Index.h に記載されている関数だけが必要ですが、さまざまな libclang*.a ファイルの目的に関するリソースやドキュメントはないようです。libclang.so が取り込むファイルを知っておくと非常に役立ちます。

4

1 に答える 1

1

プロジェクト全体にすべての静的ライブラリがある限り、次のように動作するはずです (Release/lib ディレクトリで 116 を数えました)。

clang main.c -o bin/dlc -I../llvm/tools/clang/include ../llvm/Release/lib/*.a

[編集: clang main.c -o bin/dlc -I../llvm/tools/clang/include ../llvm/Release/lib/libclang.a ../llvm/Release/lib/*.a]

出力バイナリは静的ではないことに注意してください。したがって、この構文を使用している場合、gcc または ld に -static フラグは必要ありません。

それがうまくいかない場合は、ライブラリを順番にリストする必要があるかもしれません: 一部のライブラリが別のライブラリで利用可能な関数を必要とする場合、コマンドラインで最初にリストする必要があるかもしれません。リンクの順序に関するコメントを参照してください: http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Link-Options.html#Link-Options

于 2013-02-13T20:54:05.557 に答える