アプリケーション/ライブラリのビルドを簡素化するために作成したマスター make ファイルで使用した解決策は、リンク ステップを 2 回実行することでした。-u リンカー オプションを使用して、2 番目のリンクで未定義のシンボルを指定します。
私のメイクファイルには、次のようなターゲットがあります。
undefined.txt:
@$(generate-undefined-syms)
このマクロを呼び出す...最初のリンクの試み...
define generate-undefined-syms
$(PRINTF) "$(this_makefile): Generating undefined symbols ... \n"
$(CC) -o rubbish $(LDFLAGS) $(objects) $(LDLIBS) 2>&1 | $(GREP) 'undefined reference' > tmp.txt; \
$(SED) 's/^.*`/-Wl,-u/g' < tmp.txt > undefined.txt; \
rm -f tmp.txt rubbish
endef
私のsed/regexpスキルは良くないので(そして私は急いでこれを書きました)、次を含むundefined.txtになってしまいます:
-uSomeSym'
-uSomeOtherSym'
つまり、末尾に '
次に、この make 構文を使用して を削除し、重複を削除します
undefined_references = $(filter-out follow, $(sort $(subst ',,$(shell cat undefined.txt))))
'follow' フィルタは、未定義のシンボルが何度も参照された場合、出力に "more references to XXX follow" というメッセージが表示され、undefined.txt ファイルに誤った 'follow' が含まれるためです。
-Wl, uXXXX' follow
最後に、2 回目のリンクを行います (undefined.txt への依存関係に注意してください)。
$(application): $(library_dependencies) $(objects) undefined.txt
$(CC) -o $@ $(LDFLAGS) $(undefined_references) $(objects) $(LDLIBS)
ちなみに、私は数日で簡単なビルドシステムをゼロから書くことができたので、次の本を完全にお勧めしました.
GNU Make を使用したプロジェクトの管理、第 3 版 By: Robert Mecklenburg