我想在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 []) {}
因此,這不是鏈接器可能出錯的地方。這似乎是鏈接器鏈接的東西,它不應該鏈接,但我不知道爲什麼,或者如何阻止這一點。任何人的想法?
我不是qmake的專家,但它似乎是試圖直接與中間格式的'ptx'鏈接你的對象文件。您可以嘗試在nvcc命令行中用'-cubin -o $ {...}'替換'-ptx -o $ {...}'並將cuda.output更改爲blabla.cubin。也作爲我的人印象,你有嘗試過使用cmake嗎?這是更容易,即。不需要手工編寫所有nvcc命令.. – 2012-09-03 19:36:24
感謝您的建議,但它不起作用:這樣,我在.cubin文件的某個隨機位置出現相同的鏈接錯誤。但使用'-c'(請參閱@ harrism的答案)並將'$ {QMAKE_FILE_BASE} _cuda.ptx'更改爲'$ {QMAKE_FILE_BASE} _cuda.o'確實可行。 – Yellow
實際上我錯了,@harrism是對的,你需要使用-c選項進行編譯,而-cubin只是將ptxas應用於ptx文件 – 2012-09-04 13:22:40