【问题标题】:Can't compile CUDA + OpenGL program on Mac OS X El Capitan无法在 Mac OS X El Capitan 上编译 CUDA + OpenGL 程序
【发布时间】:2016-10-12 09:04:42
【问题描述】:

我正在大学编写一个包含 OpenGL 和 CUDA 代码的程序,我可以在 Ubuntu Linux 上运行它。该程序有很多依赖项,所以我使用了一个 makefile,当我在大学里使用 Linux 时,我没有任何问题。昨天我尝试在家里的 MacBook 上运行它,但它没有运行。我正确设置了库路径,但是当我尝试使用 makefile 进行编译时,我得到以下几行:

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 $@ -c $<

Matrix.o: Matrix.cu Matrix.h my_utils2.h
$(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<

Matrix_test.o: Matrix_test.cu my_utils2.h
$(NVCC) $(INCLUDES) $(ALL_CCFLAGS) $(GENCODE_FLAGS) -o $@ -c $<


$(PROGNAME): my_utils2.o Matrix_test.o Matrix.o  
$(NVCC) $(ALL_LDFLAGS) -o $@ $+ $(LIBRARIES) -L. -lrt
mkdir -p ./bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi))
cp $@ ./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

你能帮帮我吗?

非常感谢!!

【问题讨论】:

  • 我不认为 g++ 是 supported compiler for CUDA 7.5 on mac OS。我对 Mac 开发不太熟悉,所以如果这个调用 g++ 的 Makefile 实际上以某种方式调用了引擎盖下的 clang,那么你可以忽略这个评论,但是我希望 -ccbin clang++ 而不是 -ccbin g++,就像显示的那样here
  • 编译my_utils2.o和其他.o文件的cmline是什么?我只能看到你如何链接它们的命令行。

标签: linux macos opengl makefile cuda


【解决方案1】:

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

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

此外,OpenGL 框架涵盖了 MacOS X 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 $@ $+ $(LIBRARIES) -L.

install: $(PROGNAME)
    mkdir -p ./bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi))
    cp $@ ./bin/$(OS_ARCH)/$(OSLOWER)/$(TARGET)$(if $(abi),/$(abi))

【讨论】:

  • 非常感谢!!!现在我只得到“ld:找不到-lrt的库”。我该如何解决?
  • @NicolòCogno:为 MacOS X 构建删除 -lrt。与librt 链接仅在一些 操作系统上需要,MacOS X 不属于此集合。我只需要自己谷歌一下。请参阅我的答案编辑中的差异。
  • 非常感谢!!!我做到了,但现在我得到“ld:-rpath 只能在针对 Mac OS X 10.5 或更高版本时使用”。你知道为什么吗?
  • @NicolòCogno:错误信息很清楚。 rpath 是 *nix 可执行文件中的一个字段,它指定动态链接器在运行时查找动态对象的位置(除了标准路径)。并且错误消息告诉您 OS X 10.5 或更高版本不支持此功能。因此,您必须删除该标志,从 MacOS X 的构建配置中设置一个 rpath。在 Makefile 中查找所有 rpath 标志并删除它们。但请记住,所有必需的库/动态对象都必须位于标准位置,这样才能正常工作。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2016-03-15
  • 2016-06-11
  • 2016-10-23
  • 2017-02-27
相关资源
最近更新 更多