95

このソース コードを VPS の makefile からコンパイルしようとしていますが、うまくいきません。VPS は 64 セント OS です

ここに完全なエラーがあります

# make
gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o
/usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be     used when making a shared object; recompile with -fPIC
TCP-LINUX_V1.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [all] Error 1

これが私のメイクファイルです:

GPP=g++
GCC=gcc
OUTFILE="TCP_V1.so"

COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/

all:
    $(GCC) $(COMPILE_FLAGS) ../SDK/amx/*.c
    $(GPP) $(COMPILE_FLAGS) ../SDK/*.cpp
    $(GPP) $(COMPILE_FLAGS) *.cpp
    $(GPP) -O2 -fshort-wchar -shared -o $(OUTFILE) *.o

誰が何が悪いのか知っていますか?

4

8 に答える 8

126

コンパイラの指示に従ってください。つまり、 で再コンパイルして-fPICください。このフラグの機能と、この場合にフラグが必要な理由については、GCC マニュアルのコード生成オプションを参照してください。

簡単に言うと、位置独立コード(PIC) という用語は、メモリ アドレスにとらわれない生成されたマシン コードを指します。RAM 内の位置を動的に変更できる必要があるため、位置に依存しないコードのみが共有オブジェクト (SO) に含まれることになっています。

最後に、ウィキペディアでも読むことができます。

于 2013-10-14T17:05:47.103 に答える
53

私の場合、このエラーが発生したのは、環境変数によって示されるリモート ディレクトリからmakeコマンドが共有ライブラリ (*.soファイル)をフェッチすることを予期していたためです。LDFLAGS誤って、静的ライブラリしか利用できませんでした (*.laまたは*.aファイル)。

したがって、私の問題は、コンパイルしていたプログラムではなく、取得しようとしていたリモート ライブラリにありました。-fPICしたがって、再配置エラーによって中断されたコンパイルにフラグ (たとえば、) を追加する必要はありませんでした。代わりに、リモート ライブラリを再コンパイルして、共有オブジェクトを使用できるようにしました。

基本的に、これは変装したファイルが見つからないエラーです。

私の場合、必要なプログラム--disable-sharedの呼び出しで誤って配置されたスイッチを削除するconfigure必要がありました。これは、共有ライブラリと静的ライブラリの両方がデフォルトでビルドされていたためです。


ほとんどのプログラムが両方のタイプのライブラリを同時に構築していることに気付いたので、私の場合はおそらくまれなケースです。一般に、デフォルトによっては、共有ライブラリを有効にする必要がある場合があります。

コンパイル スイッチとデフォルトを使用して特定の状況を調べるには./configure --help | less、通常、[オプション機能] セクションに表示される概要を読みます。依存関係プログラムが進化している間に更新されないインストールガイドよりも、この読み方が信頼できることがよくあります。

于 2017-02-22T09:54:01.320 に答える
11

必ずしもコンパイル フラグに関するものではありません。distcc を使用すると、gentoo でも同じエラーが発生します。

その理由は、distcc サーバーでは強化されていないプロファイルが使用されており、クライアントではプロファイルが強化されているためです。この議論を確認してください: https://forums.gentoo.org/viewtopic-p-7463994.html

于 2015-09-12T21:50:05.917 に答える
2

私も同じ問題を抱えていました。-fPICフラグを使用して再コンパイルしてみてください。

于 2018-04-30T05:36:26.770 に答える