【问题标题】:How to compile with a Makefile in sub-directories?如何使用子目录中的 Makefile 进行编译?
【发布时间】:2011-04-04 02:21:51
【问题描述】:

对于一个学校项目,我需要创建一个编译子目录而不使用任何其他 Makefile 的 Makefile。我的意思是我不能这样做:

make -C <sub-folder>

如下所示:

在本地:

   ./Makefile
   ./sub
   ./sub2

并且在子目录中:

   ./sub/file1.c
   ./sub/file2.c
   ./sub/file3.c
   ./sub/file4.c

   ./sub2/file1.c
   ./sub2/file2.c
   ./sub2/file3.c
   ./sub2/file4.c

这是我到目前为止所做的,但我不断收到错误:

CC              =       gcc -W -Wall -Werror

NAME            =       test

NAME2           =       test2

SRCS            =       sub/file1.c            \
                        sub/file2.c            \
                        sub/file3.c            \
                        sub/file4.c

SRCS2           =      sub2/file1.c            \
                        sub2/file2.c            \
                        sub2/file3.c            \
                        sub2/file4.c

OBJS            =       $(SRCS:.c=.o)

OBJS2           =       $(SRCS2:.c=.o)

all:
    $(OBJS)
    $(CC) $(OBJS) -o $(NAME)

    $(OBJS2)
    $(CC) $(OBJS2) -o $(NAME2)                                                                          

谢谢你,艾菲斯门。

[EDIT] 编辑了我的问题 我的问题有点改变。我需要在同一个 Makefile 中编译,总是使用相同的规则,两个不同的二进制文件。我尝试遵循对一个人有用的方法,但对两个人似乎并不合适。如果您有任何建议,请告诉我。

发布的代码有效,但只编译第一个二进制文件。

【问题讨论】:

  • 只是想一想:SRCS = sub/file1.c sub/file2.c ... 并从目标中删除 cds
  • 谢谢你成功了!但是我现在有第二个问题,我无法在不使用其他 makefile 的情况下同时编译两个二进制文件。

标签: c makefile


【解决方案1】:

见这篇文章:

Make Tutorial: How-To Write A Makefile

它解释了所有内容,包括为什么不使用递归 make 以及如何执行包含。

你会特别想阅读:Recursive Make Considered Harmful,它解释了为什么递归 make 不好以及避免它的方法。

【讨论】:

  • 确实,Stack Overflow 上的several 问题concerning Recursive vs Non-recursive make 包括指向一些开发良好的基于​​make 的构建系统的链接。
  • 这个教程不好,e.g.得出以下结论:因此,您仍然需要调用“make clean”…​​…大约 99% 的时间
【解决方案2】:

使用以下内容(记住在行首放置制表符而不是空格):

all: $(NAME) $(NAME2)

$(NAME): $(OBJS)
    $(CC) $(OBJS) -o $(NAME)

$(NAME2): $(OBJS2)
    $(CC) $(OBJS2) -o $(NAME2)

【讨论】:

  • 执行此操作时出现以下错误:“Nothing to be done for all”。
  • @Ephismen 这不是错误信息;这意味着all(一切)都已经制作好了。
  • 我犯了两个错误:首先我给你的错误信息是错误的,其次我在 Makefile 中有一个空间隐藏得很远,所以我想知道它是从哪里来的。无论如何,非常感谢你它完美地工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
相关资源
最近更新 更多