苦苦挣扎于GCC Makefile

时间:2016-02-22 14:19:33

标签: linux gcc makefile

我正在尝试编写我认为非常简单的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文件然后停止。

任何人都可以给予我的帮助将不胜感激。

1 个答案:

答案 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或链接器的信息,而不仅仅是显示你犯错的地方,你就知道如何找到手册页。