如何写复杂工程的makefile文件?

大虾们好:
最近我对一个CPU程序进行了GPU的移植
修改了其中一个类,然后添加了一个核函数的cu文件
但是现在我不知道怎么把GPU部分的计算加入原来的makefile文件请指教
具体情况如下:
原来的makefile文件如下:

CC = gcc
CXX = g++
CINS = -I /opt/intel/mkl/include

-I /opt/intel/compiler/include

CXXINS = $(CINS)
CFLAGS = -Wno-deprecated -O3
CXXFLASG= $(CFLAGS)
LFLAGS =
#CLIBS = -Wl,–rpath,/opt/intel/mkl/lib/em64t -L /opt/intel/mkl/lib/em64t -lmkl_lapack -lmkl
PROGRAM = biology_gcc
OBJECTS = $(FILE.o)

FILE.o = AlgorithmNBM.o biology.o stdafx.o util.o XJScore.o
XJEdge.o XJEdgeList.o XJFileStream.o XJHomogen.o
XJHomogenMap.o XJNode.o XJNodeList.o

#implementation

.SUFFIXES: .o .cpp

.cpp.o:
$(CXX) -c $(CXXINS) $(CXXFLAGS) -o $@ $<

biology: $(OBJECTS)
$(CXX) $(CXXFLAG) $(LFLAGS) -o $@ $(FILE.o) $(CLIBS)

all: $(PROGRAM)

AlgorithmNBM.o: AlgorithmNBM.cpp AlgorithmNBM.h

$(CXX) $(CXXINS) $(CFLAGS) -c $<

clean:
rm -rf *.o main

工程一共有
AlgorithmNBM.cpp biology.cpp stdafx.cpp util.cpp XJScore.cpp XJEdge.cpp XJEdgeList.cpp XJFileStream.cpp XJHomogen.cpp XJHomogenMap.cpp XJNode.cpp XJNodeList.cpp
12个源文件以及相应的头文件

修改后的情况:
我修改了其中 AlgorithmNBM.cpp 为 AlgorithmNBM.cu ,添加了核函数computeSim.cu
在AlgorithmNBM.cu的一个方法中调用核函数
核函数只是完成其中的一部分计算,原来的编译和运行规则不变

请问我应该怎么写这个makefile?
谢谢

怎么木有人回答我的问题:'(

我们把问题已经反馈给 专家 王鹏了

用nvcc编译AlgorithmNBM.cu产生.o文件,然后再链接

一般来说,往c++/c/fortran makefile里加cu文件需要:

  1.   加.cu文件编译的路径与规则
    
  2.   将.cu文件产生的目标文件加入链接列表中去
    
  3.   加cudart的路径与库到链接命令
    

举个例子,下面是一个一般的对既包含.cu有包含.cpp文件的makefile。多个.cu及.cpp文件只需要在CU_SOURCE及CXX_SOURCE里加即可。

.SUFFIXES: .cu

CU_SOURCES = kernel.cu

CXX_SOURCES = main.cpp

NVCC = /usr/local/cuda/bin/nvcc

NVCCFLAGS = -arch=sm_20 -O3 -c -Xptxas –v

CXX = g++

CXXFALGS=-c -O3

LINK = $(CXX)

LDFLAGS = -L/usr/local/cuda/lib64 -lcudart

OBJS = $(CU_SOURCES:.cu=.o) $(CXX_SOURCES:.cpp=.o)

EXE = my_exe

$(EXE): $(OBJS)

    $(LINK) -o $(EXE) $(OBJS) $(LDFLAGS)

.cu.o:

    $(NVCC) $(NVCCFLAGS) -o $@ $<

.cpp.o:

$(CXX) $(CXXFLAGS) –o $@ $<

clean:

    rm -f $(OBJ) $(EXE) *~ *.o

[indent]
[/indent]

不太明白
那我这个情况呢?你能帮我写一个吗?

太伤心了,我在现等了一天啊:'(

王鹏给的已经很清楚了,你可以自己试一下。基本的思想就是先将cpp文件和cu文件都编译成.o文件,然后再链接。

好的,谢谢
我试试