2015-11-06 4 views
1

Я пишу код CUDA и использую следующий Makefile для компиляции и связывания его вместе.g ++ скомпилированные двоичные файлы дают «невозможно выполнить двоичный файл»

DEBUG = TRUE 
CUDA_PATH = /usr/local/cuda 
INC_DIR  = ../include 
ICC = -I/usr/include -I$(INC_DIR) -I$(CUDA_PATH)/include 
LIB_CUDA = -L$(CUDA_PATH)/lib64 
NVCC = $(CUDA_PATH)/bin/nvcc 
LINT = cppcheck 
LINK = $(NVCC) 
CXX = g++ 

C_SOURCES = main.c 
CUDA_SOURCES = cuda_r_lib.cu 
EXE  = r_lib 
OBJS  = main.o 
CUDA_OBJS = cuda_r_lib.o 
HFILES  = $(INC_DIR)/r_lib.h 
MAKEFILE = Makefile 
REBUILDABLES = $(CUDA_OBJS) $(OBJS) r_lib 

LFLAGS  = -lcuda $(LIB_CUDA) 

ifdef DEBUG 
CFLAGS = -Wall -ggdb -pthread -fPIC -O3 
CDEFINES = $(ICC) 
CUDA_FLAGS = -arch=sm_20 $(ICC) 
else 
CFLAGS = -Wall -pthread -fPIC -O3 
CDEFINES = $(ICC) -DNDEBUG=1 
CUDA_FLAGS = -arch=sm_20 $(ICC) 
endif 

$(EXE): $(OBJS) $(CUDA_OBJS) 
    $(LINK) $(LFLAGS) $(OBJS) $(CUDA_OBJS) -o $(EXE) 

$(OBJS): $(C_SOURCES) $(HFILES) $(MAKEFILE) 
    $(CXX) $(CDEFINES) $(CFLAGS) -c $(C_SOURCES) -o [email protected] 
$(CUDA_OBJS): $(CUDA_SOURCES) $(HFILES) $(MAKEFILE) 
    $(NVCC) $(CUDA_FLAGS) -c $(CUDA_SOURCES) -o [email protected] 

clean: 
    rm -f *~ $(REBUILDABLES) *ii core 
lint: 
    $(LINT) --enable=all --inconclusive --std=posix *.c *.cu 

Я дошел до того, что мой код компилируется и связывается чисто. Но двоичный файл ./r_lib не выполняется. Я даже не могу изменить права доступа (CHMOD пытался + х ...)

Вот что я получаю:

[email protected]:/media/rinka/CUDA/dev/code$ make 
g++ -I/usr/include -I../include -I/usr/local/cuda/include -Wall -ggdb -pthread -fPIC -O3 -c main.c -o main.o 
/usr/local/cuda/bin/nvcc -arch=sm_20 -I/usr/include -I../include -I/usr/local/cuda/include -c cuda_r_lib.cu -o cuda_r_lib.o 
/usr/local/cuda/bin/nvcc -lcuda -L/usr/local/cuda/lib64 main.o cuda_r_lib.o -o r_lib 
[email protected]:/media/rinka/CUDA/dev/code$ ll ./r_lib 
-rw------- 1 rinka rinka 552223 Nov 6 19:08 ./r_lib 
[email protected]:/media/rinka/CUDA/dev/code$ file r_lib 
r_lib: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=8f2b88bf570a5d74c2c237969a93519f64636b86, not stripped 
[email protected]:/media/rinka/CUDA/dev/code$ ./r_lib 
bash: ./r_lib: Permission denied 
[email protected]:/media/rinka/CUDA/dev/code$ chmod +x ./r_lib 
[email protected]:/media/rinka/CUDA/dev/code$ ./r_lib 
bash: ./r_lib: Permission denied 
[email protected]:/media/rinka/CUDA/dev/code$ ll ./r_lib 
-rw------- 1 rinka rinka 552223 Nov 6 19:08 ./r_lib 

Я не могу за жизнь мне понять, что я делаю неправильно - Может быть, я просто устал. Я посмотрел на: gcc compiled binaries give "cannot execute binary file", но я не использую опцию -c при линковании ...

Кроме того - любая обратная связь на компилятор & опции компоновщика для NVCC, которые помогут бросить предупреждения более строго будут очень рады. Я не очень доволен предупреждениями, которые я получил до сих пор.

+3

Вы используете 'g ++' для .c файлов? –

+0

Это еще одна проблема. Не используйте компилятор C++ для кода C (или наоборот). Это два разных языка. Если вы пишете C++ cpde, используйте стандартный суффикс имени, например. '.cpp'. – Olaf

+0

Готово. Спасибо. –

ответ

0

Это не сообщение из вашего компилятора или инструмента сборки, а из вашей оболочки и происходит из ОС.

Для пути /media/, похоже, у вас есть ваши файлы на внешнем хранилище, например. USB-Stick. Это может быть установлено с опцией noexec, поэтому вы не можете выполнить оттуда. Кроме того, если это VFAT, в нем нет флажков-разрешений, поэтому вы не можете их установить. Вместо этого используются флаги по умолчанию, а также могут препятствовать выполнению программы из этого раздела. Это мера безопасности против вредоносного ПО.

Попробуйте mount и проверьте параметры.

Если я прав, вы должны перенести файлы в обычную файловую систему, например. твой дом.

+0

(чувство действительно глупо). Да, вы были правы Олафом, у меня это было на другом (VFAT) разделе. Теперь он скомпилирован. Спасибо. –

+0

@ RinkaSingh: если это решит вашу проблему, вы можете согласиться с ответом и удержать вверх. Это способ переполнения стека, чтобы сказать «спасибо». – Olaf

+0

Я уже сделал @Olaf. Похоже, что мой взлет не засчитывается, пока я не ударил 15 очков. OK. Я не принял ответа. Я сделал это сейчас. –

 Смежные вопросы

  • Нет связанных вопросов^_^