0

我认为按如下方式组织我的项目:

我的项目

|--src

|--包括

|--测试

核心文件位于 src 和 include 目录中,而核心的不同测试应用程序位于 test 目录中(多个 *.c 包含每个 main() 函数)。核心应构建为静态库,将链接到所有应用程序)。

如何编写一个基本的 Makefile 来满足这些要求?我已经用谷歌搜索并发现以下网站提供了用于构建可执行文件的 Makefile 模板1。如何根据我的需要扩展这个 Makefile?

如果您认为我的项目组织不好或者您有更好的想法,请告诉我!

任何帮助表示赞赏!

谢谢,乔纳斯

4

3 回答 3

0

有一个名为 dotmk 的小项目,它使 Makefile 的创建变得非常容易。

这是链接: https ://github.com/swrh/dotmk

您只需要运行安装脚本并像示例一样创建 Makefile

于 2013-02-22T16:57:26.727 回答
0

你还没有说你希望图书馆去哪里,所以我假设它应该进入src/对象已经去的地方。

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

看起来您拥有的 makefile 将从中构建test/testfoo.otest/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 回答
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) 的源文件之一,make 会重新构建 lib,而不是服务器和客户端应用程序。我有依赖问题吗?- make 或 make all 应该默认构建为 DEBUG,而 release 和 profile 分别构建一个 release 或 profile 版本。

我想知道,我的makefile有什么问题。

再次感谢!

于 2013-02-23T12:05:53.243 回答