gpt4 book ai didi

linux - 挣扎于 GCC Makefile

转载 作者:太空宇宙 更新时间:2023-11-04 09:26:46 25 4
gpt4 key购买 nike

我正在尝试编写一个我认为非常简单的 Makefile,但我感到很困惑!我不是 makefile 编写者,但我认为我对它们的理解足以让一个简单的文件正常工作。

好的,我在一个目录中有一个小项目,在这个目录中还有一个包含许多.c 文件的libs 目录。我想做的是编写一个 makefile,它将/libs 目录的内容构建到/libs 目录中的静态 lib 文件中,然后在/目录中编译一些源文件并将其链接到构建的 .a文件。

我敢肯定有人会建议“为什么不使用 cmake”,但这不是我要找的答案(像绝地武士一样挥手......呵呵呵呵)

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 $@

我的理解是第一个recipe,会把所有的.c文件都编译成object,但是好像编译了第一个.c文件就停止了。

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

最佳答案

由于您的最终应用是 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 或链接器的信息,而不仅仅是显示您犯错的地方,您就会知道如何找到手册页。

关于linux - 挣扎于 GCC Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35555978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com