【问题标题】:Struggling with a GCC Makefile在 GCC Makefile 中苦苦挣扎
【发布时间】:2016-02-22 14:19:33
【问题描述】:

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

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

【问题讨论】:

  • 参见thisthat 示例。使用最近的makemake --traceremake -x。使用 $(patsubst...);或者有一个内部libs/Makefile 并使用$(MAKE) -C libs
  • 感谢 Basile,但我已经看过这些示例,虽然它们很接近,但它们并没有完全符合我的要求。我的主要问题是 %.o : %.c 在我的脑海中应该编译 libs/ 目录中的所有 .c 文件,但实际上只编译列表中的第一个文件,然后由于我无法解释的原因而失败。 make --trace 是个好主意。
  • 所以libs/ 包含lzx.c csum.c dirs.c listner.c tree.c,而这些是您要编译并组合成libs/mylib.a 的文件,对吗?
  • +Beta 是的,我想把libs目录下的.c文件编译成libs目录下的mylib.a文件。一旦创建了 .a 文件,就可以将其链接到项目根目录中的其他文件。

标签: linux gcc makefile


【解决方案1】:

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

【讨论】:

  • 感谢您的建议和帮助,这是真的,我本可以花更多时间阅读制作手册,而不是在这里问我的问题。我宁愿希望这将是一个五分钟的事情,而不是如此艰巨。我确实尝试修改我在网上找到的示例,但现在很明显,我对 makefile 的一些先入之见是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 2014-05-11
  • 2013-02-20
  • 1970-01-01
相关资源
最近更新 更多