2016-08-03 4 views
0

ますは、私は、このようなのようなプロジェクトの構造を持っている

mcts/ 
    src/ 
     node_queue.c 
     node_queue.h 
    tests/ 
     munit.c # testing frame work 
     munit.h 
     list_test.C# includes node_queue.h and munit.h 
     Makefile # Makefile in question 

だからここに私の目的は、テストMCTS /テスト/ list_test.cをコンパイルすることです。私はこれをするためにいくつかの異なる戦略を読んだ。

:私は mcts/testsmakeを呼び出すときに、作業に約2時間で得ている最も近い

CC= gcc 
SOURCE= $(wildcard ../src/*.c ./*.c) 
OBJECTS= $(patsubst %.c, %.o, $(SOURCE)) 
INCLUDE= -I. -I../src/ 
CFLAGS= -std=c11 -g $(INCLUDE) -Werror -Wall 

list_test: list_test.o munit.o ../src/node_queue.o 
    $(CC) $(CFLAGS) $(INCLUDE) -o [email protected] list_test.o munit.o ../src/node_queue.o 

.c.o: 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

私はエラーが表示されます。ビットを読んだ後、私はこのへのMakefileから取ったいくつかのことを適応しました

list_test.o: In function `construct_test': 
/home/----/mcts/tests/list_test.c:9: undefined reference to `construct' 
collect2: error: ld returned 1 exit status 
make: *** [Makefile:8: list_test] Error 1 

ここで、構成はmcts/src/node_queue.hで定義されます。 $(INCLUDE)はヘッダーが含まれていることを確認してください。 これをどのように機能させることができますか?

多くの感謝!

+0

最初に、 '.co'ルールは必要ありません。 - Makeが組み込まれています。 – Novelocrat

+0

第2に、ベーキングパスではなく、オブジェクトを検索するディレクトリを指定するには' VPATH'を使用するのが望ましいでしょう依存関係とコマンドに変換します。私。 'list_test:list_test.o munit.o node_queue.o'と言って、そのルールは' -o $ @ $^'引数を持つコマンドを実行して、それが見つかった場合でもすべての依存関係を参照するようにします。 – Novelocrat

+0

@Novelocrat私はVPATHを探していましたが、これは読んでいました(http://make.mad-scientist.net/papers/how-not-to-use-vpath/)、それはより良いと思われました他の方法を試みる。 –

答えて

1

あなたの実際のエラーについては、リンクエラーを未定義のシンボルに報告しています。その名前のオブジェクトまたは関数がnode_queue.hに定義されていた場合は、代わりにの複数定義のエラーconstructが返されます。

あなたはおそらく、そのヘッダに宣言がありますが、定義はnode_queue.cにありません。

+0

私はちょうどcontsructとしてコンストラクトを作るのに5時間を失った...しかし、私は今すぐ自分のMakefileを持っています [gist](https://gist.githubusercontent.com/Beaudidly/b374790854a91f2e3f3f1c077381c571/raw/2c1488010ebc7d3c11b26bf34add51c63e04da25/Makefile) –

+0

すべての人に起こります。 – Novelocrat

関連する問題