CMake 3.x + CUDA - 编译失败
CMake 3.x + CUDA - compilation busted
我编写了以下具有开创性的 GPU 驱动的应用程序:
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 的失败,我可能会问另一个问题。
所以问题实际上是双重包含,还是其他原因?我该怎么办?
附加信息:
- 我在这台机器上没有 root。
- CMake 版本:3.3.2 .
- 发行版:Fedora 22(抱歉,我无能为力;但我似乎也在 Debian Stretch 上获得了这个)。
- CUDA安装位置:
$HOME/opt/cuda
,其二进制目录在$PATH
.
- 在另一个系统上,具有不同的配置和发行版(Fedora 20、CUDA 7.5,但在另一个本地目录中,可能还有其他差异)我没有得到这种行为。
我认为问题在于 nvcc 标志被传播到您的 c/c++ 编译器,因此一些编译器参数实际上被传递了两次。尝试使用 SET(CUDA_PROPAGATE_HOST_FLAGS OFF)
我编写了以下具有开创性的 GPU 驱动的应用程序:
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 的失败,我可能会问另一个问题。
所以问题实际上是双重包含,还是其他原因?我该怎么办?
附加信息:
- 我在这台机器上没有 root。
- CMake 版本:3.3.2 .
- 发行版:Fedora 22(抱歉,我无能为力;但我似乎也在 Debian Stretch 上获得了这个)。
- CUDA安装位置:
$HOME/opt/cuda
,其二进制目录在$PATH
. - 在另一个系统上,具有不同的配置和发行版(Fedora 20、CUDA 7.5,但在另一个本地目录中,可能还有其他差异)我没有得到这种行为。
我认为问题在于 nvcc 标志被传播到您的 c/c++ 编译器,因此一些编译器参数实际上被传递了两次。尝试使用 SET(CUDA_PROPAGATE_HOST_FLAGS OFF)