2016-06-11 186 views
0

我正在编写一个包含OpenGL和CUDA代码的程序,我可以在Ubuntu Linux上运行它。该程序有很多依赖关系,所以我使用makefile,当我在Linux大学时,我没有任何问题。昨天我试着在家里的MacBook上运行它,但没有运行。我设置库的路径正确,但是当我尝试使用生成文件我得到以下行来编译:无法在Mac OS X上编译CUDA + OpenGL程序El Capitan

MBP-di-Nicolo:MATRIX_TEST Nico$ make 
/Developer/NVIDIA/CUDA-7.5/bin/nvcc -ccbin g++ -m64 -Xcompiler -g -Xcompiler -arch -Xcompiler x86_64 -g -G -Xlinker -rpath -Xlinker /Developer/NVIDIA/CUDA-7.5/lib -Xlinker -framework -Xlinker GLUT -o Matrix_test my_utils2.o Matrix_test.o Matrix.o -L/System/Library -L/System/Library/Frameworks/OpenGL.framework/Libraries -lGL -lGLU ../../common/lib/darwin/libGLEW.a -L. -lrt 
nvlink fatal : Could not find fatbin in 'my_utils2.o' 
nvlink fatal : elfLink internal error 
make: *** [Matrix_test] Error 1 
MBP-di-Nicolo:MATRIX_TEST Nico$ 

这里的生成文件:

PROGNAME = Matrix_test 
#PROGNAME2 = read_file 

CC = g++ 

include ./findcudalib.mk 

# Location of the CUDA Toolkit 
CUDA_PATH ?= /Developer/NVIDIA/CUDA-7.5 


#DEK_SRC = ../pure-dek/src 
#DEK_INCLUDE = -I../pure-dek/include 

# internal flags 
NVCCFLAGS := -m${OS_SIZE} 
#NVCCFLAGS := -m${OS_SIZE} --keep 
CCFLAGS  := -g 
NVCCLDFLAGS := -g -G 
LDFLAGS  := 

# Extra user flags 
EXTRA_NVCCFLAGS ?= 
EXTRA_NVCCLDFLAGS ?= 
EXTRA_LDFLAGS  ?= 
EXTRA_CCFLAGS  ?= 

# OS-specific build flags 
ifneq ($(DARWIN),) 
LDFLAGS += -rpath $(CUDA_PATH)/lib 
CCFLAGS += -arch $(OS_ARCH) $(STDLIB) 
else 
ifeq ($(OS_ARCH),armv7l) 
ifeq ($(abi),gnueabi) 
    CCFLAGS += -mfloat-abi=softfp 
else 
    # default to gnueabihf 
    override abi := gnueabihf 
    LDFLAGS += --dynamic-linker=/lib/ld-linux-armhf.so.3 
    CCFLAGS += -mfloat-abi=hard 
endif 
endif 
endif 

ifeq ($(ARMv7),1) 
NVCCFLAGS += -target-cpu-arch ARM 
ifneq ($(TARGET_FS),) 
CCFLAGS += --sysroot=$(TARGET_FS) 
LDFLAGS += --sysroot=$(TARGET_FS) 
LDFLAGS += -rpath-link=$(TARGET_FS)/lib 
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib 
LDFLAGS += -rpath-link=$(TARGET_FS)/usr/lib/arm-linux-$(abi) 
endif 
endif 

# Debug build flags 
ifeq ($(dbg),1) 
    NVCCFLAGS += -g -G 
    TARGET := debug 
else 
    TARGET := release 
endif 

ALL_CCFLAGS := 
ALL_CCFLAGS += $(NVCCFLAGS) 
ALL_CCFLAGS += $(addprefix -Xcompiler ,$(CCFLAGS)) 
ALL_CCFLAGS += $(EXTRA_NVCCFLAGS) 
ALL_CCFLAGS += $(addprefix -Xcompiler ,$(EXTRA_CCFLAGS)) 

ALL_LDFLAGS := 
ALL_LDFLAGS += $(ALL_CCFLAGS) 
ALL_LDFLAGS += $(NVCCLDFLAGS) 
ALL_LDFLAGS += $(addprefix -Xlinker ,$(LDFLAGS)) 
ALL_LDFLAGS += $(EXTRA_NVCCLDFLAGS) 
ALL_LDFLAGS += $(addprefix -Xlinker ,$(EXTRA_LDFLAGS)) 

# Common includes and paths for CUDA 
EXT_LIB = /System/Library 
INCLUDES := 
LIBRARIES := -L$(EXT_LIB) 

# Makefile include to help find GL Libraries 
EXEC   ?= 
include ./findgllib.mk 

# OpenGL specific libraries 
ifneq ($(DARWIN),) 
# Mac OSX specific libraries and paths to include 
LIBRARIES += -L/System/Library/Frameworks/OpenGL.framework/Libraries 
LIBRARIES += -lGL -lGLU ../../common/lib/darwin/libGLEW.a 
ALL_LDFLAGS += -Xlinker -framework -Xlinker GLUT 
else 
LIBRARIES += -L../../common/lib/$(OSLOWER)/$(OS_ARCH) $(GLLINK) 
#LIBRARIES += -lglfw3 -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor -lGL -lpthread -ldl -lGLEW -lglut -lGLU 
LIBRARIES += -lglui -lglut -lGLU -lGL -lX11 -lXi -lXmu -lGLEW 
endif 

    ################################################################################ 

# CUDA code generation flags 
ifneq ($(OS_ARCH),armv7l) 
GENCODE_SM10 := -gencode arch=compute_11,code=sm_11 
endif 
GENCODE_SM10 := -gencode arch=compute_11,code=sm_11 
GENCODE_SM20 := -gencode arch=compute_20,code=sm_20 
GENCODE_SM30 := -gencode arch=compute_30,code=sm_30 -gencode   arch=compute_35,code=\"sm_35,compute_35\" 
GENCODE_FLAGS := $(GENCODE_SM11) $(GENCODE_SM20) $(GENCODE_SM30) 

################################################################################ 

# Target rules 
all: build 

build: $(PROGNAME) 


my_utils2.o: my_utils2.cu my_utils2.h 
$(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o [email protected] -c $< 

Matrix.o: Matrix.cu Matrix.h my_utils2.h 
$(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o [email protected] -c $< 

Matrix_test.o: Matrix_test.cu my_utils2.h 
$(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o [email protected] -c $< 


$(PROGNAME): my_utils2.o Matrix_test.o Matrix.o 
$(NVCC) $(ALL_LDFLAGS) -o [email protected] $+ $(LIBRARIES) -L. -lrt 
mkdir -p ./bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi)) 
cp [email protected] ./bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi)) 

run: build 
./$(PROGNAME) 

clean: 
rm -f *.o 
# rm -rf ./bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi))/mergeSort 

clobber: clean 

我没有修改用于Linux的makefile文件,除了两条线(以下是旧的):

# Location of the CUDA Toolkit 
CUDA_PATH ?= "/usr/local/cuda-7.5" 

# Common includes and paths for CUDA 
EXT_LIB = /usr/local/lib 

你能帮助我吗?

非常感谢!

+0

我不认为G ++是一个[在Mac OS的CUDA 7.5支持的编译器(http://docs.nvidia.com/cuda/cuda - 安装导-MAC-OS-X/index.html中#系统要求)。我不熟悉Mac的开发,所以如果这个Makefile调用g ++实际上在某种程度上调用clang的话,那么你可以忽略这个评论,但是我会期望'-ccbin clang ++'而不是'-ccbin g ++',就像[这里]显示的那样(http://i.stack.imgur.com/FZ04A.png) –

+0

编译'my_utils2.o'和其他.o文件的cmcm是多少?我只能看到你如何链接他们的cmdline。 – kangshiyin

回答

2

您不必使用nvcc链接最终的程序。实际上,我强烈建议不要这样做。 nvcc应该只用于编译.cu文件,其余部分留给gcc/g ++/clang。

通常,强制nvcc使用特定的编译器是一个坏主意。让它选择它的默认值。我没有在您发布的Makefile中找到(很可能在findcuda.mk)变量NVCC的定义,我怀疑是否配置了--ccbin标志。

此外,在MacOS X中,OpenGL由OpenGL框架覆盖。库libGL/libGLU用于支持通过X11服务器运行的程序(MacOS X中提供),但MacOS X的X11/GLX/OpenGL支持是兼容层,不支持CUDA。

因此,我建议你更改如下:

LIBRARIES += ../../common/lib/darwin/libGLEW.a 
LDFLAGS += -framework GLUT -framework OpenGL 

all: build install 

$(PROGNAME): my_utils2.o Matrix_test.o Matrix.o 
    $(LD) $(LDFLAGS) -o [email protected] $+ $(LIBRARIES) -L. 

install: $(PROGNAME) 
    mkdir -p ./bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi)) 
    cp [email protected] ./bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi)) 
+0

非常感谢!现在我只得到“ld:找不到-lrt的库”。我该如何解决它? –

+0

@NicolòCogno:删除MacOS X构建的'-lrt'。仅在* some *操作系统上需要链接'librt',而MacOS X不属于这个集合。我只需要Google自己。在我的答案编辑中查看差异。 – datenwolf

+0

@NicolòCogno:另请参阅http://lists.apple.com/archives/unix-porting/2008/Oct/msg00001.html – datenwolf