我想按照以下方式组织我的项目:
MY_PROJECT
| --src
| --include
| --test
核心文件驻留在目录src和include中,而核心的不同测试应用程序位于测试目录中(多个* .c包含每个main()函数)。核心应该构建为静态库,它将链接到所有应用程序。)
如何编写基本的Makefile来满足这些要求?我已经google了,发现以下网站提供了一个Makefile模板,用于构建可执行文件1。如何根据我的需求扩展Makefile?
如果您认为我的项目组织不好或者您有更好的想法,请告诉我们!
感谢任何帮助!
谢谢,Jonas
答案 0 :(得分:0)
答案 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有什么问题。
再次感谢!