0

を実行した後、4つのライブラリをフォーマットで作成するsrcフォルダーがあります。を含むフォルダーもあります。このファイルは、前述のライブラリに依存します。make.ateststests.cpp

tests内部でライブラリを生成するMakefile を取得しようとしてsrcいます (これは実行します)。次に、これらを使用してコンパイルしますtests.cpp(これは実行されません。適切にリンクされていないかのように、多くの未定義の参照が取得されます)。

フォルダtestsにはこれが含まれていますMakefile

include ../src/makefile.inc

DIR = ../src
OBJLIBS = ../src/CapaFisica.a ../src/CapaLogica.a ../src/CapaInterfaz.a ../src/Utilitarios.a

TARGETS = tests.cpp
EXE = tests

all : $(EXE)

%.a :
    -for d in $(DIR); do (cd $$d; $(MAKE)); done

tests:  $(OBJLIBS)
    $(CC) $(CFLAGS) $(OBJLIBS) -o $@ $(TARGETS)

clean :
    $(ECHO) Borrando archivos.
    -$(RM) -f ./tests
    cd $(DIR); make clean
    find . -name "*.o" -type f -print | xargs /bin/rm -f

私は何を間違っていますか?

4

1 に答える 1

2

gcc リンカは、コマンド ラインで指定された .o ファイルとスタティック ライブラリの順序に敏感です。

交換する

    $(CC) $(CFLAGS) $(OBJLIBS) -o $@ $(TARGETS)

    $(CC) $(CFLAGS) -o $@ $(TARGETS) $(OBJLIBS)

役立つかもしれません。$(OBJLIBS)また、相互に依存している .a ファイルが正しい順序になっていることも確認してください。依存するライブラリは、シンボルを定義するライブラリの前にコマンド ライン上になければなりません。

詳細については、この質問を参照してください:ライブラリがリンクされている順序が GCC でエラーを引き起こすことがあるのはなぜですか?

于 2013-04-28T00:30:01.277 に答える