.cu文件Makefile问题

时间:2011-11-10 06:30:46

标签: makefile cuda

我是linux开发的新手。 我用MPI和cuda写了一个项目。什么时候 它变得越来越大,我意识到我 现在需要一个Makefile。所以我学会了如何写作 一。 Makefile可以工作,但只能编译 cpp文件,即使我有以下两种情况 我的Makefile中的行:

.cpp.o:

    $(CC) $(CCFLAGS) $<  

.cu.o:

    $(NVCC) $(CCFLAGS) $<

知道为什么会这样吗?感谢。

2 个答案:

答案 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.cfoo.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

否则,请编辑以适应。