2015-11-06 192 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 + X ...)

這裏就是我得到:

[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

這不是來自您的編譯器或構建工具的消息,而是來自您的shell並源自操作系統的消息。

對於路徑/media/,似乎你在外部存儲器上有文件,例如一個USB棒。這可能會掛載選項noexec,所以你不能從那裏執行。另外,如果這是VFAT,則沒有許可標誌,所以你不能設置它們。相反,操作系統會使用缺省標誌,並且可能會阻止從該分區執行程序。這是針對惡意軟件的安全措施。

嘗試mount並檢查選項。

如果我是對的,您應該將文件移動到正常的文件系統,例如你家。

+0

(感覺真的很蠢)。是的,你是正確的奧拉夫,我有一個不同的(VFAT)分區。現在編好了。 謝謝。 –

+0

@RinkaSingh:如果這解決了你的問題,你可能會接受答案,並可能upvote。這是棧溢出的方式來說「謝謝你」。 – Olaf

+0

我已經做了@Olaf。看起來我的upvote不計數,直到我達到15點。 OK。我沒有接受答案。我現在已經做到了。 –