0

Ruby拡張機能をリンクしようとすると、このかなりあいまいなリンクエラーが発生し続けます。

/usr/bin/ld: Mg.o: relocation R_X86_64_PC32 against undefined symbol `init_window_class_under' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value

これについては何も見つかりませんでした。しばらく実験しましたが、ヘッダーファイルを削除すると正常にリンクされたので、ヘッダーファイルなしで移動しました(はい、非常に悪い考えです)。

今、私はそれらが必要であることがわかりました。それで、このエラーは正確には何ですか、そしてどうすればそれを取り除くことができますか?

更新:すべてをクリアした後、私はこれらの警告を受け取り始めました:

warning: ‘init_window_class_under’ used but never defined
warning: ‘init_display_mode_class_under’ used but never defined

これらは、私が最初に問題に遭遇したときにも現れました。それらが何を意味するのか正確にはわかりません。

4

2 に答える 2

1

更新されたエラーは、参照している場所init_window_class_underinit_display_mode_class_underどこかを参照しているが、定義されていないことを示しています。これらの関数は実際にはで定義されていますが、ソースファイルとヘッダーファイルの両方でWindow.c宣言されています。の関数からリンケージ修飾子をstatic削除し、のように宣言します。サブディレクトリ内のすべてで同じ間違いを犯しているようです。staticWindow.cexternWindow.hDisplay.cx11

として宣言されたものstaticはすべてファイルスコープを持ち、ファイル自体の外部には表示されません。

元のエラー:

undefined symbol `init_window_class_under'

内のすべての関数Window.cinit_window_class_under特に)がstaticあり、static関数がリンカーが検出するシンボルを生成しないために発生します。外部リンケージを持つエンティティのみが、オブジェクトファイルにシンボルを生成します。

于 2011-04-04T01:10:59.580 に答える
1

エラーメッセージが示すように、オブジェクトファイルは-fPICx86-64の共有ライブラリにリンクするためにビルドする必要があります(他のプラットフォームでもお勧めします)。

に追加-fPICし、CFLAGSすべてのオブジェクトを再構築します。

于 2011-04-04T00:04:33.257 に答える