7

それで、しばらくウェブを検索した後、私は議論のための良いフォーラムのように見えるので、ここで試してみることにしました. シンプルな gcc プラグインを作成しようとしています。プログラムコードはこのメールの最後に添付されていますが、平易な英語でプラグインを登録し、プラグマが登録されたときに pragma_init 関数が呼び出されるようにします。ここで、c_register_pragma を使用していくつかのプラグマをインターセプトします。

http://gcc.gnu.org/onlinedocs/gccint/Plugins-building.html#Plugins-buildingの例を使用してコンパイルします。コンパイルとリンクは正常に機能します。ただし、プラグインをロードすると、次のようになります。

gcc -c -fplugin=plugin.so   test.c -o test.o 

cc1: error: cannot load plugin plugin.so

plugin.so: undefined symbol: warning

私は何を間違っていますか?さらに、いくつかのヘッダー ファイル (後で必要になります) をインクルードすると、多くのエラーが発生します。たとえば、「tree.h」を含めると (50 の他のエラーの中で):

/machmode.h:262:1: error: unknown type name 'class'

 class bit_field_mode_iterator
 ^
/machmode.h:263:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token

 {
 ^
/plugin/include/tree.h:27:0,
             from conftest.c:63:

/vec.h:220:8: error: field 'register_overhead' declared as a function

誰が私が間違っているのかについての手がかりを持っていますか?

ありがとうございました

4

2 に答える 2

2

プラグインのコンパイルとプラグインの使用の両方に、どのバージョンの GCC を使用していますか? 簡単に実行

 gcc -v

調べるための他のプログラム引数はありません!

GCC プラグイン開発用の適切なパッケージをインストールしましたか (Debian または Ubuntu ではgcc-4.7-plugin-dev4.7.

(Debian または Ubuntu で) GCC をビルドするために必要なすべての依存関係をインストールしましたapt-get build-dep gcc-4.7 gcc-4.7-plugin-devか?

GCC の最近のバージョン (特に、ディストリビューションによって出荷される多くの GCC 4.7 とすべての GCC 4.8) は、C コンパイラではなく、C++ コンパイラによってコンパイルされます。

次のコマンドを実行して、 GCCが (C または C++ で)どのようにビルドされたかを確認できます。

nm -D -C $(gcc -print-file-name=cc1) 

そのコマンドが型付きの C++ 管理名を表示する場合、たとえば、GCC が C++ コンパイラでコンパイルされているexecute_ipa_pass_list(opt_pass*)のではなく(おそらく)execute_ipa_pass_listg++

そのため、GCC プラグインをコンパイルするためにg++(not )を使用する必要がある場合があります。gcc

私がコメントしたように、コンパイラを拡張またはカスタマイズするためにMELT (GCC を拡張するためのドメイン固有言語) を使用することを検討しましたか?gcc

最新のhttp://gcc-melt.org/melt-plugin-snapshot.tar.bz2をダウンロードすることをお勧めします。これは、GCC 4.7 および 4.8 用の次の MELT を数週間以内にリリースする予定だからです。

また、プラグインを使用して GCCの解析動作を変更することを期待しないでください。それは実際には不可能です (GCC は、解析された構文を拡張するためではなく、ビルトインとプラグマを追加するためのプラグイン フックのみを提供します)。

于 2013-04-11T12:13:32.720 に答える