0

私は自分のプロジェクトを次のように整理すると思います。

私のプロジェクト

| --src

|-含める

|-テスト

コアファイルはディレクトリsrcとincludeにありますが、コアのさまざまなテストアプリケーションはテストディレクトリ内にあります(各main()関数を含む複数の* .c)。コアは、すべてのアプリケーションにリンクされる静的ライブラリとしてビルドする必要があります)。

これらの要件に一致する基本的なMakefileを作成するにはどうすればよいですか?私はすでにグーグルで検索し、実行可能ファイルを構築するためのMakefileテンプレートを提供する次のWebサイトを見つけました1。このMakefileを自分のニーズに合わせて拡張するにはどうすればよいですか?

私のプロジェクト組織が悪いと思うか、より良いアイデアがある場合は、私に知らせてください!

どんな助けでも大歓迎です!

ありがとう、ジョナス

4

3 に答える 3

0

Makefile の作成を非常に簡単にする dotmk と呼ばれる小さなプロジェクトがあります。

リンクは次のとおりです。 https://github.com/swrh/dotmk

インストール スクリプトを実行し、例のように Makefile を作成するだけです。

于 2013-02-22T16:57:26.727 に答える
0

私のMakefileは次のようになりました:

SHELL = /bin/sh
CC    = gcc
AR    = ar

CFLAGS       = -std=gnu99 -Iinclude -pedantic -Wall -Wextra -march=native -ggdb3
DEBUGFLAGS   = -O0 -D _DEBUG
RELEASEFLAGS = -O2 -D NDEBUG -combine -fwhole-program
PROFILEFLAGS = -pg

ARFLAGS      = -cvq

# core and test common includes
COMMON_INC          = include/definitions.h include/debug.h

# core stuff 
CORE_LIB            = lib/libcore.a
CORE_SRC            = $(shell echo src/*.c)
CORE_INC            = $(shell echo include/*.h)
CORE_OBJ            = $(CORE_SRC:.c=.o)
CORE_PUB_INC        =

# test stuff
TEST_SERVER         = test/server/server
TEST_SERVER_SRC     = $(shell echo test/server/*.c)
TEST_SERVER_INC     = $(shell echo test/server/*.h)
TEST_SERVER_OBJ     = $(TEST_SERVER_SRC:.c=.o)

TEST_CLIENT         = test/client/client
TEST_CLIENT_SRC     = $(shell echo test/client/*.c)
TEST_CLIENT_INC     = $(shell echo test/client/*.h)
TEST_CLIENT_OBJ     = $(TEST_CLIENT_SRC:.c=.o)

all: $(CORE_LIB) $(TEST_SERVER) $(TEST_CLIENT)

core: $(CORE_LIB)

server: core $(TEST_SERVER)

client: core $(TEST_CLIENT)

$(CORE_LIB): $(CORE_OBJ)
    $(AR) -cvq $@ $^

$(TEST_SERVER): $(TEST_SERVER_OBJ)
    $(CC) $(CFLAGS) -o $@ $< -Llib -lcore

$(TEST_CLIENT): $(TEST_CLIENT_OBJ)
    $(CC)  $(CFLAGS) -o $@ $< -Llib -lcore


debug: CFLAGS += $(DEBUGFLAGS)
debug: all

profile: CFLAGS += $(PROFILEFLAGS)
profile: all

release: CFLAGS += $(RELEASEFLAGS)
release: all

.PHONY : clean depend

clean:
    -rm -f $(CORE_LIB) $(CORE_OBJ)
    -rm -f $(TEST_SERVER) $(TEST_SERVER_OBJ)
    -rm -f $(TEST_CLIENT) $(TEST_CLIENT_OBJ)
    -rm -f gmon.out

depend:
    @makedepend -- $(CFLAGS) -- $(CORE_SRC) $(TEST_SERVER_SRC) $(TEST_CLIENT_SRC)

私はまだいくつかの問題を抱えています: - make は lib、サーバーとクライアントのテストアプリを作成します コア (lib) のソース ファイルの 1 つを変更することがわかっている場合、make は lib を新しくビルドしますが、サーバー アプリとクライアント アプリはビルドしません。依存関係の問題がありますか? - make または make all はデフォルトで DEBUG としてビルドする必要がありますが、 release と profile はそれぞれリリースまたはプロファイル バージョンをビルドします。

私のmakefileの何が問題なのだろうか。

再度、感謝します!

于 2013-02-23T12:05:53.243 に答える
0

ライブラリをどこに配置したいかはまだ言われていないのでsrc/、オブジェクトが既に配置されている場所に配置する必要があると思います。

src/libcore.a: $(OBJECTS)
    $(AR) -cvq $@ $^

あなたが持っているmakefileがtest/testfoo.oそこから構築されるように見えるので、それがうまくtest/testfoo.cいくと思います。また、実行可能なテスト (例: testfoo) をどこに配置するかを指定していないので、それらを に配置しますtest/

test/%: test/%.o src/libcore.a
    $(CC) -o $@ $< -Lsrc -lcore

編集:

Make がデフォルトですべてのテストをビルドするようにしたい場合は、makefile 内の他のルールの前にこれを指定する必要があります。

TESTS := $(patsubst %.c,%,$(wildcard test/*.c))

all: $(TESTS)
于 2013-02-22T17:20:25.157 に答える