5

リンクを実行するときにg++に渡すフラグを理解するのに苦労しています。基本的に、私はこれらの「標準」フラグを使用していくつかのコードをコンパイルします。

CXXFLAGS = -Wall -Wextra -Wconversion -pedantic -std=c++0x -O2

その後、生成された.oファイルを次のようないくつかの静的ライブラリにマージします。

libxxx.a: xxx1.o xxx2.o ...
    ar rcs $@ $^
libyyy.a: yyy1.o yyy2.o ...
    ar rcs $@ $^
...

質問:

  • -static.oファイルをコンパイルするときにCXXFLAGSのフラグを使用する必要がありますか?

静的ライブラリが作成された後、実行可能ファイルをビルドするために、コンパイルされた.oファイルのいくつかをこれらのライブラリのいくつかとリンクしたいので、これを使用します。

LINKER = g++
LIB_DIR = lib/linux
SYSTEM_LIBS = -lgmp
LDFLAGS = -Wall -L $(OUTPUT_DIR) -L $(LIB_DIR) $(SYSTEM_LIBS)
$(LINKER) $^ $(LDFLAGS) -lsvm -lUtils -lKinderedSpirits -o $@

exe:
    $(LINKER) o1.o o2.o $(LDFLAGS) -lxxx -lyyy -lzzz -o $@

質問:

--staticここでフラグを使用する必要がありますか? --Wallここで意味がありますか、それともコンパイルだけに役立ちますか?-コンパイラに推奨されているものと同様に、リンカに渡す必要のある他の「標準」フラグはありますか?

また、リンク中に、GMPライブラリからの未定義の参照に関する例外が発生します。私の知る限り、-lgmpはリンカーに送信され、システムにインストールされます(コマンドラインからGMPを使用する単純なhello worldをコンパイルできました)。libxxx.alibyyy.alibzzz.aは$(LIB_DIR)にあります。たぶん私はGMPシンボルがlibxxx.aで使用されていることに言及する必要があります。


更新

GMPシンボルの未定義の参照を修正することができました。この問題は、ライブラリを配置した順序が原因で発生しました。基本的に、ここで指定されているように、-lgmpの前にGMPに依存するライブラリを参照する必要があります。とにかく、私はまだ上記の3つの質問に対する答えを探しています。

4

1 に答える 1

2

Q: ここでも -static フラグを使用する必要がありますか? A: おそらく必要ありません。このフラグは、動的ライブラリで誤ってリンクすることを不可能にするだけです。

Q: ここで -Wall は意味がありますか? それとも、コンパイルだけに役立ちますか? A: コンパイルのためだけだと思います。(ちなみに、大文字の W の後に「すべての」という単語が続きます。コンパイル中にすべての警告が必要です)

Q: コンパイラに推奨されるものと同様に、リンカに渡す必要がある他の「標準」フラグはありますか? A: 私が認識しているわけではありません。ここで一般的なオプションを見つけることができます: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

貼り付けたい特定のエラーが発生していますか?

于 2012-07-01T00:02:13.753 に答える