首页 > 解决方案 > Visual Studio 2017 msvc vs nvcc __cplusplus 宏不匹配

问题描述

我正在使用 Visual Studio 2017、平台工具集 v141 和 CUDA Toolkit 9.2。我注意到使用 nvcc编译推力::device_vector时不存在移动构造函数和移动赋值。原因是检查Thrust 库中__cplusplus宏的值的条件。

文档中所述,我将 C++ 语言标准设置为/std:c++17并另外设置/Zc:__cplusplus以便在 msvc 中正确定义宏,即201703。但是,对于 nvcc 编译的文件,宏设置为199711

我创建了一个简单的案例来重现该问题。

测试.cuh:

#pragma once
#include <iostream>
void test();

测试.cu:

#include "test.cuh"
void test()
{
    std::cout << "CU  file: " << __cplusplus << std::endl;
}

主.cpp:

#include "test.cuh"
int main()
{
    test();
    std::cout << "CPP file: " << __cplusplus << std::endl;
    return 0;
}

输出:

CU  file: 199711
CPP file: 201703

我正在寻找一种也适用于带有 FindCUDA 的 CMake 的解决方案。

标签: c++cmakecudavisual-studio-2017thrust

解决方案


通过将-Xcompiler /Zc:__cplusplus 传递给 nvcc ,我设法将 __cplusplus 设置为 201402 。由于 nvcc 最多只支持 C++14,这可能是我使用 CUDA 9.2 能得到的最好的。


推荐阅读