【问题标题】:C Makefile to compile some selective filesC Makefile 编译一些选择性文件
【发布时间】:2013-03-15 20:02:36
【问题描述】:

我正在开发一个包含大约 200 个 .c 文件和一些 .h 文件的 C 项目。最终产品中并不需要所有这 200 个文件。目前需要编译大约 180 个文件。我们有一个文件“compile_only_these.c”,其中包括项目所需的这 180 个 *.c 文件。我们的 makefile 只编译这个文件而不是单独的 .c 文件。

/* file: compile_only_these.c*/

#include "file1.c"
#include "file2.c"
.
.
.
#include "file180.c"

但我认为包含 .c 文件是个坏主意。因为每次我修改这些文件中的任何一个时,都会重新编译所有文件。

您能否建议一种更好的方法来编译这些文件。

更多信息:

  • 所有 .c 文件都在同一文件夹“../project/src”中
  • 我不断添加需要编译的新 .c 文件。我不想每次添加新文件时都修改 Makefile。
  • 我仍然想保留那些我现在没有编译的 20 个 .c 文件。我将来可能会使用它。删除这些文件将它们移动到其他目录不是解决方案

【问题讨论】:

  • 你的方法很奇怪,我在生产代码中从未见过
  • @Vorsprung:我同意。这就是为什么我打算改变这种方法。顺便说一句,这不是我设计的。

标签: c makefile


【解决方案1】:

你需要的是makefile中的一个变量,一个所需目标文件的列表,像这样:

OBJS := file1.o file2.o ... file180.o

您可以让 Make 从 compile_only_these.c 文件中构造它,如下所示:

OBJS := $(shell sed -e '/\#include/!d' -e 's/\#include "\(.*\)\.c"/\1.o/' compile_only_these.c)

您是否还需要掌握使用这些对象构建最终产品的规则?

【讨论】:

    【解决方案2】:

    如前所述,这是一种管理项目的奇怪方式,但考虑到您必须使用的内容,您可能会尝试采用这种方法...

    CC = gcc
    OBJFILE = myprog
    
    # Tweak to match whatever you compile with normally
    CFLAGS  = -O2 -Wall -std=c89 -pedantic
    LDFLAGS= # Extra flags here, for example -lm -pthread 
    
    RM = rm -f
    
    SRCS = $(wildcard *.c)
    OBJS = $(SRCS:.c=.o)
    
    $(OBJFILE):$(OBJS)
        $(CC) -o $@ $^ $(LDFLAGS)
    
    
    clean:
        $(RM) core *~ $(OBJS) $(OBJFILE)
    

    如果你想在你的 make 中做更多的事情而不仅仅是编译这个文件列表,你显然需要为你的构建层次结构的细节调整路径,但这是使用通配符获取所有文件的一般方法替换。

    【讨论】:

    • 我的问题不是关于如何编译多个文件。我想编译选择性 .c 文件。你能解释一下你的解决方案如何帮助只编译所需的文件而不是所有文件。
    • 对不起,我最初误读了这个问题。如果“额外”文件的唯一目的是保留它们以防以后需要它们,并且您不想将它们移动到新文件夹以反映这一点,您可以 a) 在 SRCS 中保留一份洗衣清单上面显示的变量,并在添加/删除文件名时保持它。 b) 将“额外的”.c 文件重命名为类似 filename.c.saved(或选择命名约定),以防止它们被 make 拾取。 b) 选项将使从构建中添加/删除文件不会比重命名更复杂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多