c - 带有共享测试问题目录的 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
解决方案
使有-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 变量CFLAGS
,LDFLAGS
而LDLIBS
不是自定义变量,以及自动变量 ( $@
, $^
...)。由于 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)
推荐阅读
- javascript - 自动播放点导航 jquery setInterval
- asp.net - 从获取请求中返回 AspNetUser 表数据
- powershell - powershell 调试控制台中的标准输出
- python-2.7 - 在 Python Tkinter 中反转阿拉伯文本
- java - Android:使用输入用户更改活动
- php - 在文本框中提交联系表默认文本
- javascript - 当我点击它时显示项目
- python - 服务器连接和读/写值
- android - 使用 android 中的改造库发送 fcm 推送通知
- android - 为什么 Retrofit Authenticator 不刷新令牌?