2016-06-11 3 views
0

대학에서 OpenGL 및 CUDA 코드가 포함 된 프로그램을 작성 중이며 우분투 리눅스에서 실행할 수 있습니다. 이 프로그램은 많은 의존성을 가지고 있으므로 메이크 파일을 사용하고 리눅스를 사용하는 대학에있을 때 아무런 문제가 없습니다. 어제는 집에서 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 

내가 리눅스에 사용되는 메이크 파일을 수정하지 않았다, 두 줄을 제외하고는 다음과 같습니다 (이전은 오래된 것입니다) :

# 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 ++있는 [맥 OS에서 CUDA 7.5에 대한 지원 컴파일러 (http://docs.nvidia.com/cuda/cuda -installation-guide-mac-os-x/index.html # 시스템 요구 사항). Mac 개발에 익숙하지 않아서, g ++을 호출하는 Makefile이 어떻게 든 후드에서 clang을 호출한다면이 주석을 무시할 수 있습니다. 그러나'-ccbin clang ++'이 아닌'-ccbin g ++' [here] (http://i.stack.imgur.com/FZ04A.png) –

+0

my_utils2.o와 다른 .o 파일을 컴파일하는 cmline은 무엇입니까? 나는 당신이 그들을 연결하는 방법의 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'를 삭제하십시오. 'librt '와의 링크는 * 일부 운영 체제에서만 필요하며 MacOS X는이 세트에 속하지 않습니다. 나는 그저 나 자신에게 구글을 가지고 있었다. 내 대답 편집에서 diff를 참조하십시오. – datenwolf

+0

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

관련 문제