Makefile用于构建链接先前构建的库的多个应用程序

时间:2013-02-22 16:46:03

标签: c makefile

我想按照以下方式组织我的项目:

MY_PROJECT

| --src

| --include

| --test

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

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

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

感谢任何帮助!

谢谢,Jonas

3 个答案:

答案 0 :(得分:0)

有一个名为dotmk的小项目,可以很容易地创建Makefile。

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

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

答案 1 :(得分: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)

答案 2 :(得分: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)的一个源文件,make make new lib,而不是服务器和客户端应用程序。我有依赖问题吗? - make或make all默认构建为DEBUG,而release和profile分别构建一个发行版或profile版本。

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

再次感谢!