我是linux开发的新手。 我用MPI和cuda写了一个项目。什么时候 它变得越来越大,我意识到我 现在需要一个Makefile。所以我学会了如何写作 一。 Makefile可以工作,但只能编译 cpp文件,即使我有以下两种情况 我的Makefile中的行:
.cpp.o:
$(CC) $(CCFLAGS) $<
.cu.o:
$(NVCC) $(CCFLAGS) $<
知道为什么会这样吗?感谢。
答案 0 :(得分:2)
Make就是生成丢失的文件。
如果您有两个规则在源存在时生成SAME文件,那么make的列表中实际存在源文件的第一个将被调用。例如,如果您有规则:
.c.o:
$(CC) -o $@ -c $<
.cpp.o:
$(CXX) -o $@ -c $<
你有两个文件,foo.c和bar.cpp然后你可以输入:
$ make foo.o
它将使用第一个规则...并在您键入
时 $ make bar.o
它将使用第二条规则。
现在假设您有两个文件foo.c
和foo.cpp
这里必须做出选择,哪个优先。为其构建规则密切使用文件的后缀。什么被认为是后缀由.SUFFIXES
指令控制。
.SUFFIXES
指令有一个默认的内置值,它以特定的顺序定义常见的后缀,如.c .cpp .cc .o等。如果我们想要改变优先顺序,我们用Makefile中的空行清除它,即:。
.SUFFIXES:
然后按照我们的定义进行操作:
.SUFFIXES: .cpp .c .o
如果你没有删除该行,那么只需将列出的后缀添加到其当前列表中,这样多个makefile就可以简单地添加新的后缀而不必担心彼此断开。
现在因为.cpp在.c之前,.cpp.o
规则优先(如果foo.cpp和foo.c都存在)
注意:是的,有一个“。”在单词SUFFIXES之前,是的,它都是大写字母。
尝试使用此Makefile来查看效果:
.SUFFIXES:
.SUFFIXES: .cpp .c .o
.c.o:
echo Compiling C
.cpp.o:
echo Compiling CPP
Make是非常强大的,并且有很好的文档记录非常值得阅读。 GNU make,可能是具有惊人扩展功能的最强大的实现,在过去让我赚了很多钱:-)享受这种体验。
答案 1 :(得分:1)
你的规则是错误的,你想要这样的东西:
%.o : %.cu
$(NVCC) $(CCFLAGS) $< -o $@
假设您需要执行的命令行类似于
nvcc foo.cu -o foo.o
否则,请编辑以适应。