Makefile导致编译错误

Posted

技术标签:

【中文标题】Makefile导致编译错误【英文标题】:Makefile leads to compilation error 【发布时间】:2013-05-09 22:15:55 【问题描述】:

我正在尝试编译一个程序(不是我的):

make -f makefile

...使用以下makefile:

# Compiler for .cpp files
CPP  = g++

# Use nvcc to compile .cu files
NVCC = nvcc
NVCCFLAGS = -arch sm_20 # For fermi's in keeneland

# Add CUDA Paths
ICUDA = /usr/lib/nvidia-cuda-toolkit/include
LCUDA = /usr/lib/nvidia-cuda-toolkit/lib64

# Add CUDA libraries to the link line
LFLAGS += -lcuda -lcudart -L$(LCUDA) -lgomp

# Include standard optimization flags
CPPFLAGS = -O3 -c -I $(ICUDA) -Xcompiler -fopenmp -DTHRUST_DEVICE_BACKEND=THRUST_DEVICE_BACKEND_OMP

# List of all the objects you need
OBJECTS  = timer.o ar1.o kGrid.o vfInit.o parameters.o

# Rule that tells make how to make the program from the objects
main :  main.o $(OBJECTS)
        $(CPP) -o main main.o $(OBJECTS) $(LFLAGS)

# Rule that tells make how to turn a .cu file into a .o
%.o: %.cu
                $(NVCC) $NVCCFLAGS $(CPPFLAGS) -c $<

# How does make know how to turn a .cpp into a .o?  It's built-in!
# but if you wanted to type it out it would look like:
# %.o: %.cpp
#       $(CPP) $(CPPFLAGS) -c $<

clean :
        rm -f *.o
        rm -f core core.*

veryclean :
        rm -f *.o
        rm -f core core.*
        rm -f main

这会导致以下命令:

nvcc -arch sm_20  -O3 -c -I /usr/lib/nvidia-cuda-toolkit/include -Xcompiler -fopenmp -DTHRUST_DEVICE_BACKEND=THRUST_DEVICE_BACKEND_OMP -c main.cu
g++  -O3 -c -I /usr/lib/nvidia-cuda-toolkit/include -Xcompiler -fopenmp -DTHRUST_DEVICE_BACKEND=THRUST_DEVICE_BACKEND_OMP  -c -o timer.o timer.cpp
g++: error: unrecognized command line option â-Xcompilerâ
make: *** [timer.o] Error 1

我不明白makefile-xCompiler 标志(在变量CPPFLAGS 中)只能由nvcc 编译器使用,而不是g++。因此,我理解为什么会出错。但是,我不明白,从我对上面makefile 的基本理解来看,为什么在某些时候变量CPPFLAGS 跟随g++(变量CPP)。我在makefile 中没有看到任何这样的序列。

【问题讨论】:

【参考方案1】:

您的main 规则需要timer.otimer.o 没有明确的规则,因此 make 使用内置的隐式规则(如 makefile 末尾的注释中所述)。将.cpp 文件转换为.o 文件的隐式规则具有以下形式

$(CPP) $(CPPFLAGS) -c $<

所以它使用包含-XcompilerCPPFLAGS 中的选项进行编译。您可能希望-Xcompiler 标志位于NVCCFLAGS 而不是CPPFLAGS

【讨论】:

啊,我明白了。我更改了makefile 以明确定义处理.cpp 文件的规则:%.o: %.cpp$(CPP) -O3 -g -c $&lt; 但现在我收到以下错误:g++ -o main main.o timer.o ar1.o kGrid.o vfInit.o parameters.o -lcuda -lcudart -L/usr/lib/nvidia-cuda-toolkit/lib -lgomp/usr/bin/ld: cannot find -lcudacollect2: error: ld returned 1 exit status

以上是关于Makefile导致编译错误的主要内容,如果未能解决你的问题,请参考以下文章

Makefile空白参数导致shell错误

llvm编译makefile152错误

在makefile错误中编译cuda文件

Makefile 中的编译错误,包括未显示

编译 C 代码时的 Makefile 错误

求助 怎么把makefile文件中的编译方法换成arm-linux-的编译方法 把该换的地方都换了 还是老提示错误