2

私の元の質問は以下ですが、次の関連する質問に発展しました:リンカー ステートメントのオブジェクトの後にリンカー フラグを配置することに何か問題がありますか?


Eclipse でビルドすると、次のリンク ステートメントが実行されます。

g++ -fopenmp -lconfig++ -o "pc2" ./main.o ./sampling.o ./simulation.o

これは正しくlconfig++ありません。オブジェクト ファイルのリストの前ではなく、後に続く必要があるからです。そこで、プロジェクトの設定をもとにEclipseが自動生成するmakefileを修正しました。具体的には、メイクファイルのこの部分を変更しました

# Tool invocations
pc2: $(OBJS) $(USER_OBJS)
    @echo 'Building target: $@'
    @echo 'Invoking: GCC C++ Linker'
    g++ -fopenmp -lconfig++ -o "pc2" $(OBJS) $(USER_OBJS) $(LIBS)
    @echo 'Finished building target: $@'
    @echo ' '

次のようになります。

# Tool invocations
pc2: $(OBJS) $(USER_OBJS)
    @echo 'Building target: $@'
    @echo 'Invoking: GCC C++ Linker'
    g++ -o "pc2" $(OBJS) $(USER_OBJS) $(LIBS) -fopenmp -lconfig++ 
    @echo 'Finished building target: $@'
    @echo ' '

次に、メイクファイルのその1行を変更した後、入力しました

make clean all -C release

コマンドラインで、次の正しいリンクステートメントを生成しました:

g++ -o "pc2" ./main.o ./sampling.o ./simulation.o -fopenmp -lconfig++

したがって、ビルド プロセスが正しくなるようにメイクファイルを修正する方法を知っています。

私が知らないのは、Eclipse が生成する makefile がリンカー フラグ (または「オプション」?) を正しい場所に配置するように Eclipse を構成する方法です。

4

1 に答える 1

1

あなた自身の質問に答えました: はい、リンク行のオブジェクトとライブラリの順序は重要です。

オブジェクト ファイルの前にリンカー フラグが必要な理由はありますか?

そのようなリンカーフラグが存在する可能性があります。たとえば、--start-groupGNU-ld リンカ オプションは (明らかに) それが開始するライブラリ グループの前になければなりません。Gold リンカー オプションは、--start-lib(明らかに) ライブラリなどを形成するオブジェクトの前に配置する必要があります。

設定で ${FLAGS} を移動できることを発見しました

Eclipse のどこかに含ま-lconfig++れている可能性がありますが${FLAGS}、それは間違いである可能性があります。これはリンカー フラグで-lconfig++なく(そのように見えますが)、ライブラリ仕様であり、おそらく${LIBS}またはそのようなものに含まれている必要があります。

于 2013-05-19T22:13:04.150 に答える