コンパイラが指示することを実行します。つまり、-fPIC
で再コンパイルします。 .このフラグの機能と、この場合にフラグが必要な理由については、コード生成オプションをご覧ください。
簡単に言えば、位置に依存しないコードという用語 (PIC) は、メモリ アドレスに依存しない生成されたマシン コードを指します。つまり、RAM にロードされた場所について何の仮定も行いません。 RAM 内の位置を動的に変更できる必要があるため、位置に依存しないコードのみが共有オブジェクト (SO) に含まれることになっています。
最後に、Wikipedia でそれについて読むことができます
私の場合、このエラーは make
が原因で発生しました コマンドは共有ライブラリを取得することを期待していました (*.so
ファイル) LDFLAGS
で示されるリモート ディレクトリから 環境変数。誤って、静的ライブラリしか利用できませんでした (*.la
または *.a
ファイル)。
したがって、私の問題は、コンパイルしていたプログラムにはありませんでしたが、取得しようとしていたリモート ライブラリにありました。そのため、フラグを追加する必要はありませんでした (-fPIC
) 再配置エラーによって中断されたコンパイルに。むしろ、共有オブジェクトが使用できるようにリモート ライブラリを再コンパイルしました。
基本的に、ファイルが見つからないというエラーが偽装されています。
私の場合、間違った --disable-shared
を削除する必要がありました configure
に切り替える 共有ライブラリと静的ライブラリの両方がデフォルトで構築されているため、必要なプログラムの呼び出し。
ほとんどのプログラムが両方のタイプのライブラリを同時に構築していることに気付いたので、私の場合はおそらくまれなケースです。一般に、デフォルトによっては、共有ライブラリを有効にする必要がある場合があります。
コンパイル スイッチとデフォルトで特定の状況を調べるには、./configure --help | less
で表示される概要を読み上げます。 、通常はオプション機能のセクションにあります。依存関係プログラムが進化しても更新されないインストール ガイドよりも、この読み方が信頼できることがよくあります。
-no-pie
で修正 リンカー段階のオプション:
g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...