首页 > 解决方案 > 带有共享测试问题目录的 Makefile

问题描述

                      $Project
                         |
       ------------------+----------------+
       |                 |                |
      Method1          Method2          Test-Problems

我正在做一个 C 语言项目,我需要比较两种方法的实现,将它们应用于相同的测试问题。我应该如何编写makefile?

现在我在每个方法的目录上都有重复的测试问题文件,我使用下一个简单的 makefile:

# Compiler.
SYS = Linux
CC = /usr/bin/gcc 

# FLAGS.
MPFRPATH=/usr/local/include/
FLAGS=-I$(MPFRPATH) -O2 -Wall -std=c99 -fno-common -mfma

#LIBFLAGS.
LIBPATH1=/usr/local/lib/
LIBFLAGS=-L$(LIBPATH1) 

OBJECTS = *.o

%.o: %.c 
   ${CC} -D MPFR_WANT_FLOAT128 -fPIC ${FLAGS} -c -I./  $<

fun: $(OBJECTS) 
   ${CC}  -shared -o libMethod1.so -fPIC $(OBJECTS) $(LIBFLAGS) -lmpfr -lgmp 

标签: cmakefile

解决方案


使有-C directory-f Makefile选项。因此,如果您将 Makefile 存储在顶层目录中,您可以从该顶层目录调用 make:

make -C Method1 -f ../Makefile

如果这两种情况之间存在差异,您可以使用 make 变量来处理它们。例如,M带有值1或的变量2

fun: $(OBJECTS)
    ${CC} -shared -o libMethod$(M).so ...

和:

make -C Method1 -f ../Makefile M=1

您还可以从 Makefile 内部测试当前目录,而不是在命令行上传递 make 变量:

M = $(patsubst Method%,%,$(notdir $(PWD)))
...
fun: $(OBJECTS)
    ${CC} -shared -o libMethod$(M).so ...

它与您的问题无关,但您的 Makefile 存在一些问题。您应该考虑使用标准的 make 变量CFLAGSLDFLAGSLDLIBS不是自定义变量,以及自动变量 ( $@, $^...)。由于 make 已经知道如何编译源文件,如果您使用标准的 make 变量,您甚至不需要自己编写规则。

更重要的是,您不应该使用通配符来获取目标文件列表:如果它们不存在但列表为空。始终在源文件上使用通配符,因为您确定它们已经存在。fun当文件目标可以完成工作时( ) ,不要使用非文件目标(libMethod1.so):

M        = $(patsubst Method%,%,$(notdir $(PWD)))
INCLUDE  = /usr/local/include .
CFLAGS   = $(addprefix -I,$(INCLUDE)) -O2 -Wall -std=c99 
CFLAGS   += -shared -fno-common -mfma -fPIC -DMPFR_WANT_FLOAT128
LIBPATH  = /usr/local/lib
LDFLAGS  = $(addprefix -L,$(LIBPATH))
LDLIBS   = -lmpfr -lgmp
SOURCES  = $(wildcard *.c)
OBJECTS  = $(patsubst %.c,%.o,$(SOURCES))

libMethod$(M).so: $(OBJECTS) 
    $(CC) $(CFLAGS) $(LDFLAGS) -o$@ $^ $(LDIBS)

推荐阅读