【问题标题】:CUDA 7.0, invalid argument '-std=c++11' not allowed with 'C/ObjC'CUDA 7.0,“C/ObjC”不允许使用无效参数“-std=c++11”
【发布时间】:2015-01-16 18:08:45
【问题描述】:

我最近下载了 CUDA 7 并将其设置为与我的项目一起使用。在 Mac 上,CUDA 7 需要 clang 作为宿主编译器。

现在,我正在使用许多 C++11 功能。我已经通过传递给 nvcc 的 -std=c++11 启用了这些功能。但是,如果我将 -Xcompiler -std=c++11 传递给 nvcc,无论我是否也单独传递了 -std=c++11,我都会收到以下错误。错误是:

“'C/ObjC' 不允许使用无效参数 '-std=c++11'”

看起来这应该可行,它当然适用于 GCC。任何人都有解决方法。否则,我将向 Nvidia 提交错误报告。

【问题讨论】:

  • 在 6.5/gcc 中也不适用于我 - 我猜 CUDA 会根据您编写的内容生成 C 代码。为什么你认为你需要-Xcompiler? CUDA7 发行说明中的​​示例说使用--std=c++11,这就足够了。
  • 有趣!它确实适用于 6.5 和 GCC,但不知道为什么会有所不同。出现问题是因为我将 -std=c++11 指定为主机标志,并且 FindCUDA.cmake 自动将其作为 -Xcompiler -std=c++11 转发给 nvcc。 (我需要它作为主机标志,因为我的主机文件。)
  • 所以如果你只指定-std=c++11 而不手动指定-Xcompiler(没有cmake 或其他任何东西,只指定nvcc),它编译得好吗?
  • 是的!如果我将 -std=c++11 分别指定给 nvcc 和主机编译器,那就完美了。
  • @user2333829 这是否表明问题在于 CMake 构建了不正确的编译器调用,而不是 CUDA 软件堆栈的任何组件的问题?

标签: c++11 cuda clang


【解决方案1】:

nvcc -dryrun ... 将显示nvcc 将执行的命令。我目前无法访问 CUDA 7,只有 6.5,但我的问题,其中包括两个编译生成的 C 源代码的命令。此代码由cudafe 生成,必须由 C 编译器编译,但-Xcompiler 添加了 C 和 C++ 模式的选项。

我想我的 gcc 情况的不同之处在于,当您遇到错误时我会收到警告(这正是 gcc 和 clang 在这种情况下的不同之处)。对于这两个编译器,我看不到任何抑制它的方法,所以我想你必须修复你的 .cmake 文件以省略 -Xcompiler 选项。这个选项不应该用于语言标准,只是一些非常特定于编译器的东西。

【讨论】:

    【解决方案2】:

    当然不行。您在使用 C 或 Objective-C 编译器时指定 C++ 选项。源文件必须是 C++ 或 Objective-C++。

    【讨论】:

    • 我认为这一点都不清楚! CUDA 是一种 C++ 语言。我的源文件是 C++。宿主代码,也就是 C++,由宿主编译器(在本例中为 clang)处理。当我不指定 -Xcompiler -std=c++11 标志并且只指定 -std=c++11 标志时,它编译得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2012-03-03
    • 1970-01-01
    • 2013-12-09
    • 2016-07-08
    相关资源
    最近更新 更多