为什么我得到" nvcc致命:重新定义论点'优化'"?

时间:2015-04-17 18:40:54

标签: optimization compiler-errors cuda nvcc compiler-flags

我正在尝试在MacBook Pro Retina上使用CUDA驱动程序版本:7.0.36和cuda toolkit 7.0在nVidia GT 750 M中编译,以下代码及其makefile但是它给了我这个错误:

  

nvcc致命:重新定义论证'优化'。

尽管我已经能够用nvcc编译和执行其他程序,使用makefile等等,现在我不是。

另外,我无法找到有关此错误的有用信息,所以我在此问它是否有人知道如何解决它。我是CUDA的新手,所以如果您需要更多信息,请索取。

这是我的Makefile.inc

CXX             := nvcc
OPTIM           := -O3
DEBUG           := -g -DOLB_DEBUG
CXXFLAGS        := $(OPTIM)
ARPRG           := ar
LDFLAGS         := -O3
PARALLEL_MODE   := OFF
OMPFLAGS        := -fopenmp
BUILDTYPE       := precompiled
INPUTDIR        := ./input
OUTPUTDIR       := ./output
INCDIR          := ./inc
OBJDIR          := ./obj
SRCDIR          := ./HeatTransfer
BINDIR          := ./bin
###########################################################################
## defines shell
SHELL           := /bin/sh

Makefile

###########################################################################
ROOT := .
include $(ROOT)/Makefile.inc
######################################################## Operational system
OS     = $(shell uname -s)
MACH   = $(shell uname -m)
HOST   = $(shell uname -n)
WHOAMI = $(shell whoami  )
###########################################################################
HeatTransfer := \
mesh\
stack
PROGRAM := $(BINDIR)/program
###########################################################################
OBJECTS := $(foreach file, $(HeatTransfer), $(OBJDIR)/$(file).o)
###########################################################################
all : compile link
###########################################################################
compile : $(OBJECTS)

$(OBJDIR)/%.o: $(SRCDIR)/%.cu
        @echo Compile $<
        $(CXX) $(CXXFLAGS) -I$(INCDIR) -c $< -o $@
###########################################################################
link: $(PROGRAM)

$(PROGRAM): $(OBJECTS)
        @echo Link $@
        $(CXX) $(LDFLAGS) -I$(INCDIR) $(foreach file, $(HeatTransfer), $(OBJDIR)/$(file).o) $(LDFLAGS) -I$(INCDIR) -o $@
###########################################################################
clean : cleanprog cleanobj

cleanprog: 
        @echo Clean rubbish files
        @rm -f *~ core .tmpfile $(PROGRAM)

cleanobj:
        @echo Clean object files
        @rm -f $(OBJECTS)
###########################################################################
###########################################################################

我尝试编译时的完整信息是:

...Heat_Transfer_CUDA$ make
Compile HeatTransfer/mesh.cu
nvcc -O3 -I./inc -c HeatTransfer/mesh.cu -o obj/mesh.o
Compile HeatTransfer/stack.cu
nvcc -O3 -I./inc -c HeatTransfer/stack.cu -o obj/stack.o
Link bin/program
nvcc -O3 -I./inc  ./obj/mesh.o  ./obj/stack.o -O3 -I./inc -o bin/program
nvcc fatal   : redefinition of argument 'optimize'
make: *** [bin/program] Error 1

1 个答案:

答案 0 :(得分:7)

问题是由于您的链接命令指定-O3开关两次而引起的:

nvcc -O3 -I./inc  ./obj/mesh.o  ./obj/stack.o -O3 -I./inc -o bin/program
     ^^^                                      ^^^

这是不允许的 - 它会产生错误。

由于您makefile指定LDFLAGS 两次使用这一事实,似乎会出现此问题:

    $(CXX) $(LDFLAGS) -I$(INCDIR) $(foreach file, $(HeatTransfer), $(OBJDIR)/$(file).o) $(LDFLAGS) -I$(INCDIR) -o $@

这不应该是必要的。取而代之的是:

    $(CXX) $(LDFLAGS) -I$(INCDIR) $(foreach file, $(HeatTransfer), $(OBJDIR)/$(file).o) -o $@

应该可以解决这个问题。