2015-12-07 53 views
0

我已經寫了下面的突破性的GPU供電應用:CMake的3.X + CUDA - 編譯搗毀

int main() { return 0; } 

,我嘗試使用CMake的構建它。這是我的CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.8) 
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} " -std=c++11") 
find_package(CUDA QUIET REQUIRED) 
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} " -std=c++11") 
cuda_add_executable(a a.cu) 

有了這個文件,因爲某些原因,編譯失敗;它看起來像(儘管我不確定),原因是CMake讓NVCC使用CUDA包含目錄兩次。其結果是:

/home/joeuser/opt/cuda/bin/nvcc -M -D__CUDACC__ /home/joeuser/src/kt3/a.cu -o /home/joeuser/src/kt3/CMakeFiles/a.dir//a_generated_a.cu.o.NVCC-depend -ccbin /usr/bin/ccache -m64 --std c++11 -Xcompiler ,\"-g\" -std=c++11 -DNVCC -I/home/joeuser/opt/cuda/include -I/home/joeuser/opt/cuda/include 
nvcc fatal : redefinition of argument 'std' 
CMake Error at a_generated_a.cu.o.cmake:207 (message): 
    Error generating 
    /home/joeuser/src/kt3/CMakeFiles/a.dir//./a_generated_a.cu.o 

你可能會問,爲什麼我的MWE是不是更簡潔。如果我不使用C++ 11,爲什麼需要上面的那些選項設置行?那麼,如果我刪除它們,我仍然會得到雙重包含,但是早期的失敗涉及到ccache,我可能會問另一個問題。

那麼問題其實是雙重包含,還是別的?我該怎麼做?

其他信息:

  • 我沒有這臺機器上的根。
  • CMake版本:3.3.2。
  • 分佈:Fedora 22(對不起,我無法提供幫助;但我似乎也在Debian Stretch上獲得了這個)。
  • CUDA安裝位置:$HOME/opt/cuda,其二進制目錄位於$PATH
  • 在另一個系統上,使用不同的配置和發行版(Fedora 20,CUDA 7.5但在另一個本地目錄中,可能存在其他差異),我做而不是得到此行爲。

回答

2

我認爲問題在於nvcc標記會傳播到您的c/C++編譯器,因此有些編譯器參數會有效地傳遞兩次。嘗試使用SET(CUDA_PROPAGATE_HOST_FLAGS OFF)

+0

我已經解決了此問題,但您可能是對的,所以我會接受,但其他用戶 - 請注意,此答案不是100%驗證... – einpoklum