2012-09-03 100 views
1

我想在32位Windows 7系統上編譯Qt Creator 4.8.0中的Cuda代碼(以.cu文件的形式),並且我目前失敗。在Qt中編譯與Cuda導致鏈接錯誤

我總結了以下的項目文件:

TARGET = TestCUDA 
DESTDIR = release 
OBJECTS_DIR = release/obj 
CUDA_OBJECTS_DIR = release/cuda 

SOURCES += main.cpp 
CUDA_SOURCES += test.cu 

CUDA_SDK = "C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK 4.2/C" # Path to cuda SDK install 
CUDA_DIR = "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v4.2" # Path to cuda toolkit install 

INCLUDEPATH += $$CUDA_DIR/include \ 
       $$CUDA_SDK/common/inc/ \ 
       $$CUDA_SDK/../shared/inc/ 
QMAKE_LIBDIR += $$CUDA_DIR/lib/Win32 \ 
       $$CUDA_SDK/common/lib/Win32 \  
       $$CUDA_SDK/../shared/lib/Win32 
LIBS += -lcuda -lcudart 
CUDA_INC = $$join(INCLUDEPATH,'" -I"','-I"','"') # this is to put quotes around paths with spaces 

cuda.input = CUDA_SOURCES 
cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.ptx 
cuda.commands = $$CUDA_DIR/bin/nvcc.exe $$CUDA_INC $$LIBS --machine 32 -ptx -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME} 
cuda.dependency_type = TYPE_C 
QMAKE_EXTRA_COMPILERS += cuda 

據說這是爲了產生釋放/ CUDA /文件夾test_cuda.ptx模塊。順便說一句,這正是它所做的,歡呼! 但它也給一個LNK1107錯誤:

C:\path\to\release\cuda\test_cuda.ptx:-1: error: LNK1107: invalid or corrupt file: cannot read at 0xFCC 

我不知道爲什麼會這樣,也不知道如何解決它。此錯誤中指示的位置位於test_cuda.ptx文件的中間,但這沒有任何幫助。同樣奇怪的是,當我將它導入另一個Cuda應用程序時,這個相同的文件完美地工作,所以文件沒有損壞。 main.cpp是完全空的:

int main(int argc, char* argv []) {} 

因此,這不是鏈接器可能出錯的地方。這似乎是鏈接器鏈接的東西,它不應該鏈接,但我不知道爲什麼,或者如何阻止這一點。任何人的想法?

+0

我不是qmake的專家,但它似乎是試圖直接與中間格式的'ptx'鏈接你的對象文件。您可以嘗試在nvcc命令行中用'-cubin -o $ {...}'替換'-ptx -o $ {...}'並將cuda.output更改爲blabla.cubin。也作爲我的人印象,你有嘗試過使用cmake嗎?這是更容易,即。不需要手工編寫所有nvcc命令.. – 2012-09-03 19:36:24

+0

感謝您的建議,但它不起作用:這樣,我在.cubin文件的某個隨機位置出現相同的鏈接錯誤。但使用'-c'(請參閱@ harrism的答案)並將'$ {QMAKE_FILE_BASE} _cuda.ptx'更改爲'$ {QMAKE_FILE_BASE} _cuda.o'確實可行。 – Yellow

+0

實際上我錯了,@harrism是對的,你需要使用-c選項進行編譯,而-cubin只是將ptxas應用於ptx文件 – 2012-09-04 13:22:40

回答

1

如@asm所述,您正在編譯爲PTX中間文件,然後嘗試將它們作爲目標文件進行鏈接。但是與@ asm的建議相反,你不應該編譯爲cubin,而是編譯爲對象文件。要做到這一點,你想要的-c選項而非-ptx選項:

cuda.input = CUDA_SOURCES 
cuda.output = $$CUDA_OBJECTS_DIR/${QMAKE_FILE_BASE}_cuda.o 
cuda.commands = $$CUDA_DIR/bin/nvcc.exe $$CUDA_INC $$LIBS --machine 32 -c -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME} 

警告:不是QMAKE用戶因此上述可能不完全正確。我第二次推薦CMake。