2016-07-26 5 views
0

ビルドしている小さなライブラリについては、以下のような単純な構造になっています。私は私が構築することができますmake build_testは、それ自身のバイナリ make:テストディレクトリにある各ファイルのテストバイナリを作成します。

test_が付い./test下にあるすべてのソースファイルを構築したい、私はmake build./source

  • 下のソースからのライブラリー(libproj.a)を構築したい

    • ライブラリlibproj.aでも問題はありませんが、テストの構築方法を理解することはできません。 /cygdrive/d/Source/proj/build/obj/test_proj.o:test_proj.c:(.text+0x15): undefined reference to 'test'をビルドしようとすると、現在次のリンカーエラーが表示されます。

      $(CC) $(LDFLAGS) -L $(DIR_BLD_LIB) -l $(PROJECT) $< -o [email protected] 
      

      間違っている:

      ディレクトリ構造

      +---build 
      | +---lib 
      | +---obj 
      | \---test 
      +---include 
      | \---proj 
      +---source 
      \---test 
      

      Makefileの

      PROJECT    = proj 
      LIBNAME    = lib$(PROJECT).a 
      
      CFLAGS    = -Wall -Wextra -O0 
      
      DIR_ROOT   = $(abspath .) 
      DIR_SRC_LIB   = $(DIR_ROOT)/source 
      DIR_SRC_TEST  = $(DIR_ROOT)/test 
      
      DIR_BLD_OBJ   = $(DIR_ROOT)/build/obj 
      DIR_BLD_LIB   = $(DIR_ROOT)/build/lib 
      DIR_BLD_TEST  = $(DIR_ROOT)/build/test 
      
      LST_OBJ_LIB   = $(patsubst $(DIR_SRC_LIB)/%.c, $(DIR_BLD_OBJ)/%.o, $(wildcard $(DIR_SRC_LIB)/*.c)) 
      LST_OBJ_TEST  = $(patsubst $(DIR_SRC_TEST)/%.c, $(DIR_BLD_OBJ)/%.o, $(wildcard $(DIR_SRC_TEST)/*.c)) 
      LST_BIN_TEST  = $(patsubst $(DIR_SRC_TEST)/%.c, $(DIR_BLD_TEST)/%, $(wildcard $(DIR_SRC_TEST)/test_*.c)) 
      
      INCLUDES   = -I $(DIR_ROOT)/include 
      
      clean: 
          $(RM) $(LST_OBJ_LIB) 
          $(RM) $(LST_OBJ_TEST) 
      
      build: 
          $(info build) 
      
      build-test: $(LST_BIN_TEST) 
          $(info build-test) 
      
      run-test: 
          $(info run-test) 
      
      install: 
          $(info install) 
      
      $(LIBNAME): $(LST_OBJ_LIB) 
          $(AR) rvs $(DIR_BLD_LIB)/[email protected] $^ 
      
      $(DIR_BLD_OBJ)/%.o: $(DIR_SRC_LIB)/%.c 
          $(CC) $(CFLAGS) $(INCLUDES) -c $< -o [email protected] 
      
      $(DIR_BLD_TEST)/%: $(DIR_BLD_OBJ)/%.o $(LIBNAME) 
          $(CC) $(LDFLAGS) -L $(DIR_BLD_LIB) -l $(PROJECT) $< -o [email protected] 
      
      $(DIR_BLD_OBJ)/%.o: $(DIR_SRC_TEST)/%.c 
          $(CC) $(CFLAGS) $(INCLUDES) -c $< -o [email protected] 
      
  • +0

    これらのテストファイルをどのようなバイナリでビルドしますか?独立した実行ファイルに?または、何かにリンクされているオブジェクトファイル? –

    +0

    @GeorgP。独立した実行可能ファイル、はい。たとえば、test_libproj、test_mytestという名前が付いています(対応するソースファイル名の場合)。 –

    +0

    @GeorgP。追加情報の追加 –

    答えて

    0

    私の推測では、この行があることです。あなたはコンパイラ(私はgccと仮定している)にオブジェクトファイルの前にライブラリを渡しています。あなたのコンパイラがgccと同じように動作する場合、ライブラリのコードは、see -l option documentationを解析するときにまだ参照されていないため、破棄されています。

    それはまた

    $(CC) $(LDFLAGS) -L $(DIR_BLD_LIB) $< -l $(PROJECT) -o [email protected] 
    

    $<の変化位置を注)

    なければならない、ライブラリの順序が重要であることを覚え:この優れたexplanationを参照。

    関連する問題