2015-12-07 52 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