我正在尝试编写我认为非常简单的Makefile,我只是感到困惑!我不是一个makefile编写者,但我认为我理解它们足以让一个简单的工作。
好的,我在一个目录中有一个小项目,并且在这个目录中还有一个包含许多.c文件的libs目录。我要做的是编写一个makefile,它将/ libs目录的内容构建到/ libs目录中的静态lib文件中,然后在/目录中编译一些源文件并将其链接到内置的.a文件。
我确定有人会建议“为什么不使用cmake”,但这不是我正在寻找的答案(波浪像绝地...... ehehehehe)
CC = gcc
CFLAGS = -Wall
SOURCES = lzx.c csum.c dirs.c listner.c tree.c
OBJECTS = $(SOURCES:.c=.o)
TARGETLIB = libs/mylib.a
TARGET = TestApp
libs/%.o : libs/%.c
$(CC) $CFLAGS -c $<
$(TARGETLIB) : $(OBJECTS)
ar rcs $@ $^
$(TARGET) :
$(CC) $CFLAGS Source1.cpp Source2.cpp -llibs/mylib.a -o $@
我的理解是,第一个配方,将所有.c文件编译成对象,但似乎编译第一个.c文件然后停止。
任何人都可以给予我的帮助将不胜感激。
答案 0 :(得分:2)
由于您的最终应用是TARGET,因此您应首先制作Makefile规则。并且由于它也依赖于TARGETLIB,因此它应该作为依赖项给出,如下所示:
$(TARGET): $(TARGETLIB)
$(CC) $(CFLAGS) Source1.cpp Source2.cpp -Lmylib -o $@
接下来我假设您提到的* .c文件是lib文件。因此,您需要一个前缀,因为您希望手动指定它们,而不是通过通配符或规则。
OBJECTS = $(addprefix(libs, $(SOURCES)):.c=.o)
最后我想到的是库名,它应该是libSOMENAME.a(好吧,链接器在路径和-Lotherpaths中搜索此名称)。所以我们有:
TARGETLIB = libs/libmylib.a
总结一下:
CC = gcc
CFLAGS = -Wall
SOURCES = lzx.c csum.c dirs.c listner.c tree.c
OBJECTS = $(addprefix(libs, $(SOURCES)):.c=.o)
TARGETLIB = libs/libmylib.a
TARGET = TestApp
$(TARGET) : $(TARGETLIB)
$(CC) $(CFLAGS) Source1.cpp Source2.cpp -static -L./libs -lmylib -o $@
$(TARGETLIB) : $(OBJECTS)
ar rcs $@ $^
是的,这可以写得更好,但是我想如果你想了解更多有关Makefile或链接器的信息,而不仅仅是显示你犯错的地方,你就知道如何找到手册页。