リンクを実行するときに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つの質問に対する答えを探しています。